Shiro

头像
张张
    阅读 8 分钟
    1

    Shiro安全框架


    认证拦截

    基本环境配置

    在pom。xml添加依赖image
    (当初在写加密的时候已经配置过了,不用再配置)

    核心配置

    首先,在com.cy.pj.common.config包下创建SpringShiroConfig类image
    再写一个方法要求能够返回登录页面,所以在pageController类中添加doLoginUI方法image
    访问一下发现上锁认证拦截了


    认证业务实现

    判定身份的合法性,认证业务API处理流程分析image

    数据层

    首先在SysUserDao接口中添加findUserByUserName方法image

    业务层

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

    控制层

    在SysUserController类上添加doLogin方法image
    写完之后发现登陆的时候不能也去认证,所以要修改配置类,在SpringShiroConfig类中shiroFilterFactory方法上添加map.put("/user/doLogin","anon");
    测试
    当登陆成功以后点击退出会出现一个路径,现在要实现点击退出要会到登陆页面,只需在SpringShiroConfig类中shiroFilterFactory方法上添加map.put("/doLogout","logout");即可。
    当登陆时输入错误的账号密码,希望给一个友好的提示,所以创建一个异常处理类,在com.cy.pj.common.web包下GlobalExceptionHandler类中添加doHandleShiroException方法image
    课堂练习:连续输入六次之后不让使用,24小时之后打开。

    shiro框架授权过程

    当点击日志的删除的时候,有权限的人才能够删除,没权限的不允许删除。
    业务过程分析:当触发删除请求的时候,会调用服务端业务层执行删除任务,那现在在SysLogServiceImpl类deleteObject方法上添加@RequiresPermissions("sys:log:delete")注解,当使用次注解描述方法时,这个方法就作为一个切入点方法,当调用此方法时执行权限检查,把授权业务放在一个通知方法里,在通知方法里,当执行删除犯法事获取用户权限,看看用户的权限是否包含注解中的字符串,包含则授权访问,否则抛异常。那么什么情况下才可以授权方法呢?(当用户权限标识中包含注解中定义的权限标识才可以授权访问),如何获取用户的权限呢?
    首先找到用户有什么角色image
    然后找到角色有什么样的菜单访问权限image
    然后找到这个菜单有什么权限标识image
    假如找到用户上有这么多的授权标识,可以看看是否包含@RequiresPermissions注解里边的值,如果有,就有权访问

    代码

    首先,在SpringShiroConfig类里添加authorizationAttributeSourceAdvisor方法image
    取菜单里面的数据怎么取,菜单和角色有关,角色和用户有关,可以通过用户找到角色id,然后通过角色菜单关系表找菜单image

    dao层

    首先SysUserRoleDao接口写findRoleIdsByUserId方法,有,找到角色了,基于角色id找到菜单,在SysRoleMenuDao接口添加findMenuIdsByRoleIdsimage
    因为是多个参数,所以在映射文件做配置SYSRoleMenuMapper文件添加查询image
    菜单id有了,就基于菜单id找授权标识,所以在SysMenuDao添加findUserMenus方法image
    然后在SysMenuMapper文件image

    业务层

    封装权限信息,在ShiroUserRealm类里的doGetAuthorizationInfo方法获取权限信息,并且把权限信息封装好返回给SecurityManagerimage
    测试!将来如果有一个方法必须授权才能够访问,就在方法上假如@RequiresPermissions注解描述,给一个授权标识。


    shiro的缓存配置

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

    shiro记住我

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

    修改密码

    从登录那拿到密码进行修改。
    首先在starter页面的doLoadUI添加一个函数image
    首先在SysUserDao接口添加updatePassword方法image基于用户的id去修改密码盐值和修改时间。然后在业务层SysUserService接口添加updatePassword方法image,然后实现方法image,然后在控制层SYSUserController类中添加doUpdatePassword方法image
    测试,运行

    呈现菜单

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

    控制层访问拦截

    在世间允许范围内允许登录,不允许禁止登录
    首先,定义一个拦截器,在com.cy.pj.common.web包下创建TimeAccessInterceptor类image,构建完成拦截器以后要注册拦截器对象,所以要写一个配置对象。
    在com.cy.pj.common.config包下创建SpringWebConfig配置类image
    测试,发现登录不了,没有发现,因为拦截器返回值是false,不会执行,但是返回是true就可以进来,然后设置拦截时间,所以在preHandle方法添加时间拦截image,将来在TimeAccessInterceptor类中可能还会有postHandle方法image

    项目业务总结

    image
    请求向右走,先走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配置删除,然后添加image
    第二步,实现realmimage,然后找到ShiroUserRealm类,然后把@service注解去掉。
    然后在SpringShiroConfig类中配置认证和授权image
    然后设置登录的url,在yml添加image
    然后测试
    然后配置缓存的配置,在SpringShiroConfig类上添加shiroCacheManager方法image,然后测试


    张张
    10 声望1 粉丝

    « 上一篇
    Shiro