关于java:Shiro

6次阅读

共计 4296 个字符,预计需要花费 11 分钟才能阅读完成。

Shiro 平安框架


认证拦挡

根本环境配置

在 pom。xml 增加依赖
(当初在写加密的时候曾经配置过了,不必再配置)

外围配置

首先,在 com.cy.pj.common.config 包下创立 SpringShiroConfig 类
再写一个办法要求可能返回登录页面,所以在 pageController 类中增加 doLoginUI 办法
拜访一下发现上锁认证拦挡了


认证业务实现

断定身份的合法性,认证业务 API 解决流程剖析

数据层

首先在 SysUserDao 接口中增加 findUserByUserName 办法

业务层

在 com.cy.pj.sys.service.realm 包下增加 ShiroUserRealm 类,继承 AuthorizingRealm,因为这个对象默认也继承了认证,所以间接蕴含了认证和受权
写完之后要把 Ream 注入给 SecurityManager,所以要找到 SpringShiroConfig 类的 securityManager 办法

管制层

在 SysUserController 类上增加 doLogin 办法
写完之后发现登陆的时候不能也去认证,所以要批改配置类,在 SpringShiroConfig 类中 shiroFilterFactory 办法上增加 map.put(“/user/doLogin”,”anon”);
测试
当登陆胜利当前点击退出会呈现一个门路,当初要实现点击退出要会到登陆页面,只需在 SpringShiroConfig 类中 shiroFilterFactory 办法上增加 map.put(“/doLogout”,”logout”); 即可。
当登陆时输出谬误的账号密码,心愿给一个敌对的提醒,所以创立一个异样解决类,在 com.cy.pj.common.web 包下 GlobalExceptionHandler 类中增加 doHandleShiroException 办法
课堂练习: 间断输出六次之后不让应用,24 小时之后关上。

shiro 框架受权过程

当点击日志的删除的时候,有权限的人才可能删除,没权限的不容许删除。
业务过程剖析: 当触发删除申请的时候,会调用服务端业务层执行删除工作,那当初在 SysLogServiceImpl 类 deleteObject 办法上增加 @RequiresPermissions(“sys:log:delete”)注解,当应用次注解形容办法时,这个办法就作为一个切入点办法,当调用此办法时执行权限查看,把受权业务放在一个告诉办法里,在告诉办法里,当执行删除犯法事获取用户权限,看看用户的权限是否蕴含注解中的字符串,蕴含则受权拜访,否则抛异样。那么什么状况下才能够受权办法呢?(当用户权限标识中蕴含注解中定义的权限标识才能够受权拜访),如何获取用户的权限呢?
首先找到用户有什么角色
而后找到角色有什么样的菜单拜访权限
而后找到这个菜单有什么权限标识
如果找到用户上有这么多的受权标识,能够看看是否蕴含 @RequiresPermissions 注解里边的值,如果有,就有权拜访

代码

首先,在 SpringShiroConfig 类里增加 authorizationAttributeSourceAdvisor 办法
取菜单外面的数据怎么取,菜单和角色无关,角色和用户无关,能够通过用户找到角色 id,而后通过角色菜单关系表找菜单

dao 层

首先 SysUserRoleDao 接口写 findRoleIdsByUserId 办法,有,找到角色了,基于角色 id 找到菜单,在 SysRoleMenuDao 接口增加 findMenuIdsByRoleIds
因为是多个参数,所以在映射文件做配置 SYSRoleMenuMapper 文件增加查问
菜单 id 有了,就基于菜单 id 找受权标识,所以在 SysMenuDao 增加 findUserMenus 办法
而后在 SysMenuMapper 文件

业务层

封装权限信息,在 ShiroUserRealm 类里的 doGetAuthorizationInfo 办法获取权限信息,并且把权限信息封装好返回给 SecurityManager
测试!未来如果有一个办法必须受权才可能拜访,就在办法上如果 @RequiresPermissions 注解形容,给一个受权标识。


shiro 的缓存配置

当咱们点击删除的时候能够在 ShiroUserRealm 类中的 doGetAuthorizationInfo 办法打印一行,发现每次执行操作时都会从新获取受权信息,这是个费时的过程,然而用户的受权信息好长时间都不会扭转,所以能够把受权信息放到一个 cache 外面,如何实现。
首先在我的项目配置类 SpringShiroConfig 类外面增加一个 cacheManager,办法名为 shiroCacheManager,因为 cacheManager 是一个接口,所以必定是要构建接口的子类类型
配置当前,认证和受权都是由 SecurityManager 来实现的,既然都是 SecurityManager 来实现的,那么 SecurityManager 拿到信息当前会办法 CacheManager 所对应的 cache 对象中,所以在 securityManager 办法参数上,要关联 CacheManager 这个对象,而后把这个对象注入给 SecurityManager
测试。

shiro 记住我

当在登录时,上面有一个复选框勾选,登录当前即使是浏览器敞开,下一次也不必从新登录。前端参数曾经在 login 页面设置好了,控制器只须要接管参数即可。在 SysUserController 类中 doLogin 办法上增加一个参数为 isRememberMe,而后提交 ,而后做一个配置。关上 SpringShiroConfig 类,写一个 rememberMeManager 办法,而后也要把记住我这个 manager 也要注入给 securityManager,所以在 securityManager 办法上再次注入一个对象
而后认证办法也要产生一些变动,可能不须要用户输出也能登录了,从 cookie 去数据的时候 map.put(“/**”,”autch”); 前面的值要改为 user
测试!
cookie 默认保留三十分钟,也能够本人去设置。首先在 SpringShiroConfig 类中增加 sessionManager 办法
配置完当前要注入给 securityManager,所以在 securityManager 办法中增加参数
测试
登录胜利当前显示用户名。因为当用户登录胜利当前会把用户信息存储到 Session 对象中,两种办法,第一种是进入页面,通过 ajax 向服务端发异步申请,然而耗时操作能够这么写,所以还有一种办法,就是在 PageController 类上 doIndexUI 办法写
,先从 shiro 框架的 session 对象中取出登录用户信息,而后将用户对象存储到 model 而后在 starter 页面上基于 thymelf 标签获取 model 的数据
测试。
当初在 SysLogAspect 类中给的用户名是假的,当初能够改为真的
当前如果须要用户名都这么写,所以能够写一个工具类,在 com.cy.pj.common.utils 包下创立一个 ShiroUtils 工具类
而后方才两个能够从新写一下。

批改明码

从登录那拿到明码进行批改。
首先在 starter 页面的 doLoadUI 增加一个函数
首先在 SysUserDao 接口增加 updatePassword 办法 基于用户的 id 去批改明码盐值和批改工夫。而后在业务层 SysUserService 接口增加 updatePassword 办法 ,而后实现办法,而后在管制层 SYSUserController 类中增加 doUpdatePassword 办法
测试,运行

出现菜单

想基于权限的不同去更新菜单,因为也是查问菜单,所以是在 SYSMenuDao 接口,而后查问进去之后要进行封装,所以要写一个封装类 SysUserMenu,所以在接口中就一个是增加 findUserMenus 办法 ,而后配置在 SysMenuMapper 映射文件
因为 select 只是查问到了 p 那一部分信息,然而还有对应的子菜单的信息,所以要写 resultMap。而后写业务层在 SysMenuService 接口增加 findUserMenus 办法
而后写实现类 ,因为返回的是菜单信息,所以写在菜单实现类,
拿到这个值能够再 pageController 里边去调用
怎么显示 userMenus,在 start 页面上批改

管制层拜访拦挡

在世间容许范畴内容许登录,不容许禁止登录
首先,定义一个拦截器,在 com.cy.pj.common.web 包下创立 TimeAccessInterceptor 类 ,构建实现拦截器当前要注册拦截器对象,所以要写一个配置对象。
在 com.cy.pj.common.config 包下创立 SpringWebConfig 配置类
测试,发现登录不了,没有发现,因为拦截器返回值是 false,不会执行,然而返回是 true 就能够进来,而后设置拦挡工夫,所以在 preHandle 办法增加工夫拦挡,未来在 TimeAccessInterceptor 类中可能还会有 postHandle 办法

我的项目业务总结


申请向右走,先走 filter 过滤器,这个是 javaee 中的一个标准,shiro 认证拦挡的时候用到的就是过滤器,过滤器对象就是 SpringShiroConfig 类里的 anon 和 logout,过滤之后要调用 controller,申请首先达到 dispatchservlet,在这个前端控制器调用 controller 之前会有一个 HandlerInterceptor 拦截器,这个拦截器的作用是在前端控制器在解决申请时在调用后端控制器之前要先执行 HandlerInterceptor 办法,这是对管制层办法做拦挡,aop 是管制层掉业务层的时候做拦挡。在数据层通过 sqlsession 实现数据库会话的时候,有一个 interceptor 拦截器,这是 mybatis 中的。

改成 3.03 版本

扩大一些业务点,第一配置 shiro 的扭转,把 SpringShiroConfig 类中的所有办法都删除,而后基于 http://shiro.apache.org/ 中 shi…
首先把 pom 文件里的 shiro 配置删除,而后增加
第二步,实现 realm,而后找到 ShiroUserRealm 类,而后把 @service 注解去掉。
而后在 SpringShiroConfig 类中配置认证和受权
而后设置登录的 url,在 yml 增加
而后测试
而后配置缓存的配置,在 SpringShiroConfig 类上增加 shiroCacheManager 办法,而后测试

正文完
 0