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办法,而后测试