1、权限控制的实现
2、两种实现权限管理的方法
1)底层基于拦截器或者过滤器实现
2)底层基于代理技术实现,为Action创建代理对象,由代理对象进行权限校验(实际上Transtion事务注解也是将Service变成动态代理对象)
3、apache shiro框架的使用
shiro框架的核心功能:
- 认证
- 授权
- 会话管理
- 加密
shiro框架认证流程:
- Application Code:应用程序代码,由开发人员负责开发的
- Subject:框架提供的接口,代表当前用户对象
- SecurityManager:框架提供的接口,代表安全管理器对象
- Realm:可以开发人员编写,框架也提供一些,类似于Dao,用于访问权限数据
在项目中应用shiro框架进行认证:
一、在realm中进行认证(login)
第一步:引入shiro框架相关的jar
第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器(一定要在Struts的过滤器前)
shiroFilter org.springframework.web.filter.DelegatingFilterProxy shiroFilter /*
启动tomcat服务器,抛出异常:spring工厂中不存在一个名称为“shiroFilter”的bean对象
第三步:在spring配置文件中配置bean,id为shiroFilter
第四步:配置安全管理器
/css/** = anon /js/** = anon /images/** = anon /validatecode.jsp* = anon /login.jsp = anon /userAction_login.action = anon /page_base_staff.action = perms["staff-list"] /* = authc
第五步:修改UserAction中的login方法,使用shiro提供的方式进行认证操作
/** * 用户登录,使用shiro框架提供的方式进行认证操作 */public String login(){ //从Session中获取生成的验证码 String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key"); //校验验证码是否输入正确 if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){ //使用shiro框架提供的方式进行认证操作 Subject subject = SecurityUtils.getSubject();//获得当前用户对象,状态为“未认证” AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), MD5Utils.md5(model.getPassword()));//创建用户名密码令牌对象 try{ subject.login(token); }catch(Exception e){ e.printStackTrace(); return "login"; } TUser user = (TUser) subject.getPrincipal(); ServletActionContext.getRequest().getSession().setAttribute("loginUser", user); return "home"; }else{ //输入的验证码错误,设置提示信息,跳转到登录页面 this.addActionError("输入的验证码错误!"); return "login"; }}
第六步:自定义realm
public class BOSRealm extends AuthorizingRealm { @Autowired private IUserDao userDao; //认证方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){ System.out.println("realm中的认证方法执行了。。。。"); UsernamePasswordToken mytoken = (UsernamePasswordToken)token; String username = mytoken.getUsername(); //根据用户名查询数据库中的密码 TUser user = userDao.findUserByUserName(username); if(user == null){ //用户名不存在 return null; } //如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致;第一个参数是subject.getPrincipal的返回值类型,第二个是密码,第三个是任意字符串 AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName()); return info; } //授权方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; // retutn是return给安全管理器,return null的话会抛出异常 }}
并注入给安全管理器
二、使用shiro的方法注解方式权限控制
第一步:在spring配置文件中开启shiro注解支持
第二步:在Action的方法上使用shiro注解
第三步:在realm中进行授权
//授权方法protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 获取用户对象 TUser user1 = (TUser) SecurityUtils.getSubject().getPrincipal(); TUser user2 = (TUser) principals.getPrimaryPrincipal(); System.out.println(user1==user2); // TODO 根据用户对象查询数据库进行授权 // 直接(不查数据库)为用户授权 info.addStringPermission("staff-list"); return info;}
第四步:在struts.xml中配置全局异常捕获,当shiro框架抛出权限不足异常时,跳转到权限不足提示页面
/login.jsp /redirect.jsp
三、使用shiro提供的页面标签方式权限控制
第一步:在jsp页面中引入shiro的标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
第二步:使用shiro的标签控制页面元素展示
四、总结
URL拦截权限控制(基于过滤器实现)
方法注解权限控制(基于代理技术实现)
页面标签权限控制(标签技术实现)
代码级别权限控制(基于代理技术实现)
4、参数同名问题
参数同名问题,会先给model赋值 1)删除model中的字段 2)将page从model中get出来,在给pagebean赋值
5、EasyUI的combotree的使用
combotree插件不能像ztree一样使用简单json