權限概述
系統中有很多功能,這些功能並不是每一個登錄的用戶都能操作的,需要對用戶操作系統的能力進行限制,該過程就叫權限
認證:系統提供的標識用戶身份的功能(通常實現比如:登錄)(告訴系統你是誰?)
授權:系統提供的根據用戶的身份賦予其不同的操作系統能力功能(告訴系統你能做什麼?)
系統啓動 ---->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;
}
}