博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BOS10——权限控制的实现,apache shiro权限管理框架的使用,参数同名问题,EasyUI的combotree的使用...
阅读量:5299 次
发布时间:2019-06-14

本文共 4215 字,大约阅读时间需要 14 分钟。

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配置文件中配置beanidshiroFilter

第四步:配置安全管理器

/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

 

转载于:https://www.cnblogs.com/x54256/p/8604326.html

你可能感兴趣的文章
ios12--简易购物车
查看>>
go17---并发
查看>>
守护线程
查看>>
VC++中使用MFC通过ADO连接数据库
查看>>
JavaScript验证注册信息
查看>>
延时加载图片
查看>>
C++库(Thrift)
查看>>
Hadoop综合大作业
查看>>
正则表达式
查看>>
C#获取执行存储过程的" 返回值"代码
查看>>
C# WinForm制作电子琴键盘
查看>>
2017系列(序):一系列佳作,喜迎2017
查看>>
Android开发——高斯模糊效果的简单实现
查看>>
今天再次认真整理了浏览器收藏夹
查看>>
Codeforces Round #215 (Div. 2) D题(离散化+hash)
查看>>
C# DES进行加解密
查看>>
sql里面的分页
查看>>
作业10-异常
查看>>
apache伪静态规则及常见规则用法实例
查看>>
移动端(1)
查看>>