權限控制

權限概述

系統中有很多功能,這些功能並不是每一個登錄的用戶都能操作的,需要對用戶操作系統的能力進行限制,該過程就叫權限

認證:系統提供的標識用戶身份的功能(通常實現比如:登錄)(告訴系統你是誰?)

授權:系統提供的根據用戶的身份賦予其不同的操作系統能力功能(告訴系統你能做什麼?)


系統啓動 ---->web.xml|--->spring容器--->掃描Action Service Dao

                     |--->OAListener---->通過spring容器中的service加載權限數據

                                                |

                     |--->struts過濾器 --->權限檢驗攔截器

用戶請求    ------------> 加載struts.xml        |

<--------------跳轉到權限不足界面---------檢驗通過執行action

權限模型

權限表:保存系統中所有的需要進行限制的功能,表名auth_function

角色表:權限關聯的角色(比如業務員,總裁,經理,總監),auth_role

用戶表:t_user

權限角色的映射表:role_function

角色用戶的映射表:user_role

權限控制方式

url攔截控制方式(基於攔截器或過濾器)

方法註解控制方式

/**

* 登錄

* @return

*/

public String login(){

//獲取驗證碼

String checkcodeBySession = (String) 

ServletActionContext.getRequest().getSession().getAttribute("key");

//校驗驗證碼

if(StringUtils.isNoneBlank(checkcode) && checkcode.equals(checkcodeBySession)){

//驗證碼通過

//校驗用戶名和密碼

//獲取用戶名和密碼

String username = t.getUsername();

String password = t.getPassword();

if(StringUtils.isNoneBlank(username) && StringUtils.isNoneBlank(password)){

password = MD5Utils.md5(password);

//獲取shiro的subject對象

Subject subject = SecurityUtils.getSubject();//未認證的用戶對象

//創建用戶名和密碼令牌

AuthenticationToken authenticationtoken = new UsernamePasswordToken(username,password);

//根據用戶對象調用login方法,調用安全管理器進行認證

try {

//登錄成功

subject.login(authenticationtoken);

//獲取當前用戶

User user = (User) subject.getPrincipal();

ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);

return "home";

} catch (Exception e) {

//登錄失敗

//用戶名或密碼有誤!

this.addActionMessage(this.getText("error.usernameorpassword"));

e.printStackTrace();

}

return "login";

}else{

//用戶名或密碼有誤!

this.addActionMessage(this.getText("error.usernameorpassword"));

return "login";

}

}else{

//驗證碼有誤!

this.addActionMessage(this.getText("error.checknode"));

return "login";

}

}

import javax.annotation.Resource;


import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.SimpleAuthenticationInfo;

import org.apache.shiro.authc.UsernamePasswordToken;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;


import cn.itcast.bos.dao.IUserDao;

import cn.itcast.bos.domain.Function;

import cn.itcast.bos.domain.User;

import cn.itcast.bos.service.IFunctionService;


public class BosRealm extends AuthorizingRealm{


@Resource

private IUserDao userDao;

@Resource

private IFunctionService functionService;

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {


//獲取當前登錄用戶

User user = (User) principalCollection.getPrimaryPrincipal();

//通過用戶名查詢用戶權限

List<Function> list = functionService.findFunctionByUsername(user.getUsername());

//授權方法

SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();

if(null != list && list.size()>0){

for(Function function : list){

sai.addStringPermission(function.getCode());

}

}

return sai;

}


@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {


//獲取用戶名和密碼令牌

UsernamePasswordToken upt = (UsernamePasswordToken)authenticationToken;

//獲取用戶名和密碼

String username = upt.getUsername();

//根據username查詢用戶

List<User> list = userDao.conditionQuery("findUserByUsername", username);

if(null != list && list.size()>0){

//返回到安全管理器中,安全管理器會校驗密碼

AuthenticationInfo ai = new SimpleAuthenticationInfo

(list.get(0), list.get(0).getPassword(), this.getClass().getSimpleName());

return ai;

}

return null;

}


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章