权限概述
系统中有很多功能,这些功能并不是每一个登录的用户都能操作的,需要对用户操作系统的能力进行限制,该过程就叫权限
认证:系统提供的标识用户身份的功能(通常实现比如:登录)(告诉系统你是谁?)
授权:系统提供的根据用户的身份赋予其不同的操作系统能力功能(告诉系统你能做什么?)
系统启动 ---->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;
}
}