• 5分钟上手Shiro认证功能与注解式开发


    目录

    一、Shiro认证

    二、注解式开发


    一、Shiro认证

    上次我们分享了Shiro框架的认证功能,在这里我们继续分享Shiro框架的功能之一:授权

    ①UserMapper.xml添加两个方法

    1. <select id="getRolesByUserId" resultType="java.lang.String" parameterType="java.lang.String">
    2. SELECT roleid FROM t_shiro_user_role ur,t_shiro_user u where ur.userid=u.userid and u.username=#{userName}
    3. select>
    4. <select id="getPersByUserId" resultType="java.lang.String" parameterType="java.lang.String">
    5. SELECT rp.perid FROM t_shiro_user u,
    6. t_shiro_user_role ur,
    7. t_shiro_role_permission rp
    8. where ur.userid=u.userid
    9. and ur.roleid=rp.roleid
    10. and u.username= #{userName}
    11. select>

     ②对应的server层、biz层添加两个方法

    UserMapper:

    1. Set getRolesByUserId(@Param("userName") String userName);
    2. Set getPersByUserId(@Param("userName") String userName);

    UserBiz:

    1. Set getRolesByUserId(String userName);
    2. Set getPersByUserId(String userName);

    UserBizImpl:

    1. @Override
    2. public Set getRolesByUserId(String userName) {
    3. return userMapper.getRolesByUserId(userName);
    4. }
    5. @Override
    6. public Set getPersByUserId(String userName) {
    7. return userMapper.getPersByUserId(userName);
    8. }

    ③改变配置文件中的授权字段:

     ④自定义的Realm添加授权方法:

    业务流程:
      1) 获取验证身份(用户名)
      2) 根据身份(用户名)获取角色和权限信息
      3) 将角色和权限信息设置到SimpleAuthorizationInfo

    1. @Override
    2. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    3. String userName = principals.getPrimaryPrincipal().toString();//获取账户名
    4. Set roleIds = userBiz.getRolesByUserId(userName);
    5. Set perIds = userBiz.getPersByUserId(userName);
    6. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    7. // 将当前登录的权限交给shiro的授权器
    8. info.setStringPermissions(perIds);
    9. // 将当前登录的角色交给shiro的授权器
    10. info.setRoles(roleIds);
    11. return info;
    12. }

    ⑤效果演示: 

     


    二、注解式开发

    ①常用注解:

    @RequiresAuthenthentication:表示当前Subject已经通过login进行身份验证;即 Subject.isAuthenticated()返回 true

    @RequiresUser:表示当前Subject已经身份验证或者通过记住我登录的

    @RequiresGuest:表示当前Subject没有身份验证或者通过记住我登录过,即是游客身份

    @RequiresRoles(value = {"admin","user"},logical = Logical.AND):表示当前Subject需要角色admin和user

    @RequiresPermissions(value = {"user:delete","user:b"},logical = Logical.OR):表示当前Subject需要权限user:delete或者user:b

    ②将我们需要的注解添加到方法上:

    身份认证:requireUser

    角色认证:requireRole

    权限认证: requirePermission

    ③在springmvc-servlet.xml中添加拦截器相关配置 

    1. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    2. depends-on="lifecycleBeanPostProcessor">
    3. <property name="proxyTargetClass" value="true">property>
    4. bean>
    5. <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    6. <property name="securityManager" ref="securityManager"/>
    7. bean>
    8. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    9. <property name="exceptionMappings">
    10. <props>
    11. <prop key="org.apache.shiro.authz.UnauthorizedException">
    12. unauthorized
    13. prop>
    14. props>
    15. property>
    16. <property name="defaultErrorView" value="unauthorized"/>
    17. bean>

     ④添加Controller进行验证:

    1. package com.zq.ssm.controller;
    2. import org.apache.shiro.authz.annotation.Logical;
    3. import org.apache.shiro.authz.annotation.RequiresPermissions;
    4. import org.apache.shiro.authz.annotation.RequiresRoles;
    5. import org.apache.shiro.authz.annotation.RequiresUser;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. @RequestMapping("/shiro")
    9. @Controller
    10. public class ShiroController {
    11. // RequiresUser代表 当前方法只有登录后才能够访问
    12. // RequiresUser等价于spring-shiro.xml中的/user/updatePwd.jsp=authc配置
    13. @RequiresUser
    14. @RequestMapping("/passUser")
    15. public String passUser() {
    16. System.out.println("身份认证通过!");
    17. return "admin/addUser";
    18. }
    19. //RequiresRoles 代表当前方法只有具备指定的角色才能访问
    20. // RequiresRoles等价于spring-shiro.xml中的/admin/*.jsp=roles[4]配置
    21. @RequiresRoles(value = {"1", "4"}, logical = Logical.AND)
    22. @RequestMapping("/passRole")
    23. public String passRole() {
    24. System.out.println("角色认证通过!");
    25. return "admin/addUser";
    26. }
    27. //RequiresRoles 代表当前方法只有具备指定的权限才能访问
    28. // RequiresRoles等价于spring-shiro.xml中的/user/teacher.jsp=perms[2]配置
    29. @RequiresPermissions(value = {"2"}, logical = Logical.AND)
    30. @RequestMapping("/passPermission")
    31. public String passPermission() {
    32. System.out.println("权限认证通过!");
    33. return "admin/addUser";
    34. }
    35. }

    注意: 

     @RequiresRoles(value = {"1", "4"}, logical = Logical.AND)代表必须同时满足角色1和角色4同时认证才能通过;

     @RequiresRoles(value = {"1", "4"}, logical = Logical.OR)代表必须满足角色1或者角色4任意一方认证就能通过;

    ⑤效果演示:

    1)当我们不登录进行验证:

    报错: 

     2)登录只有角色1的账户访问角色认证请求:

     

    报错:

      3)登录满足权限1和权限4的的账户访问授权请求:

     

    通过:

     

  • 相关阅读:
    将一个硬盘空间分配给另一个硬盘,怎么把一个磁盘的空间给另一个磁盘
    基于JAVA-游戏账号交易平台-演示录像-计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    【C++面向对象侯捷】5.操作符重载与临时对象
    RocketMQ 系列(四) 消息存储
    单⽚机常⽤的⼏种通信协议
    自然算法 - AI面试基础补全
    Java 进阶:实例详解 Java 虚拟机字节码指令
    2022 年 10 月区块链操作系统的开发回顾
    Spring Boot——Thymeleaf生成PDF实战教程
    想让你的代码简洁,试试这个SimpleDateFormat类高深用法
  • 原文地址:https://blog.csdn.net/weixin_66110079/article/details/126577503