• shiro授权-SSM


    一、shiro授权角色、权限

    在这里插入图片描述

    首先分析数据库,我们有一个用户表,角色表,还有权限表,权限和角色中间表,角色和用户中间表,那么我们可以通过前台传过来一个用户名,从而通过联查查出我们该用户对应的角色和权限

    所有我们首先在UserMapper.xml中加入两个方法

    <!-- 根据用户名查找用户角色 -->
      <select id="getRolesByUserId" resultType="java.lang.String" parameterType="java.lang.String" >
             select ur.roleid from t_shiro_user u,t_shiro_user_role ur
            where u.userid = ur.userid and u.username = #{userName}
      </select>
    
      <!-- 根据用户名查找用户角色 -->
      <select id="getPersByUserId" resultType="java.lang.String" parameterType="java.lang.String">
         select rp.perid from t_shiro_user u,t_shiro_user_role ur,t_shiro_role_permission rp
         where u.userid = ur.userid and ur.roleid = rp.roleid and u.username = #{userName}
      </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后在写UserMapper

    Set<String> getRolesByUserId(@Param("userName") String userName);
    
        Set<String> getPersByUserId(@Param("userName") String userName);
    
    • 1
    • 2
    • 3

    在写biz层 UserBiz

     //授角色
        Set<String> getRolesByUserId(String userName);
    
        //授权限
        Set<String> getPersByUserId(String userName);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在写实现UserBizImpl

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

    在续写我们的MyRealm

     /**
         * 授权
         * @param principals
         * @return
         * 替代shiro-web-ini
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            System.out.println("用户授权。。。。");
            //拿到授权用户
            String userName = principals.getPrimaryPrincipal().toString();//获取账户名
            //调用方法
            Set<String> persByUserId = userBiz.getPersByUserId(userName);//查询权限
            Set<String> rolesByUserId = userBiz.getRolesByUserId(userName);//查询角色
            //拿到授权器
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //把当前用户权限交给Shiro的授权器(将当前登录的权限交给shiro授权器)
            info.setRoles(rolesByUserId);
            // 将当期登录的角色交给shiro授权期
            info.setStringPermissions(persByUserId);
            return info;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    测试

    可以看到上图,我们的zs只有一个权限,而且zdm权限全都可以访问

    登录zs(只有个人密码修改可以进入)

    在这里插入图片描述在这里插入图片描述在这里插入图片描述**加粗样式**

    二、Shiro的注解式开发

    常用注解介绍
    @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

    首先我们在springmvc-servlet.xml中配置shiro

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

    使用注解写Shiro1UserController

    package com.xlb.ssm.controller;
    
    import org.apache.shiro.authz.annotation.Logical;
    import org.apache.shiro.authz.annotation.RequiresPermissions;
    import org.apache.shiro.authz.annotation.RequiresRoles;
    import org.apache.shiro.authz.annotation.RequiresUser;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author 波哥
     * @QQ 2212371722
     * @company 波哥集团
     * @create  2022-08-26 19:38
     */
    @RequestMapping("/shiro")
    @Controller
    public class Shiro1UserController {
    
        //shiro注解
    //    @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
    
    
        //@RequiresUser 代表当前方法只要登录后才能够访问
        // @RequiresUser 可以替代 spring-shiro-xml中的/user/updatePwd.jsp=authc
        @RequiresUser
        @RequestMapping("/passUser")
        public String passUser(){
            return "admin/addUser";
        }
    
        //@RequiresRoles 代表当前方法只有具备指定的角色后才能够访问
        // @RequiresRoles 可以替代 spring-shiro-xml中的 /admin/*.jsp=roles[4]
        @RequiresRoles(value = {"1","4"},logical = Logical.AND)
        @RequestMapping("/passRole")
        public String passRole(){
            System.out.println("角色认证通过。。。");
            return "admin/addUser";
        }
    
        //@RequiresPermissions 代表当前方法只有具备指定的权限后才能够访问
        // @RequiresPermissions 可以替代 spring-shiro-xml中的 /user/teacher.jsp=perms[2]
        @RequiresPermissions(value = {"2"},logical = Logical.AND)
        @RequestMapping("/passPermission")
        public String passPermission(){
            System.out.println("权限认证通过。。。");
            return "admin/addUser";
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    前端测试main.jsp

    <%@taglib prefix="r" uri="http://shiro.apache.org/tags" %>
    
    
        Title
    
    
    

    主界面<%=System.currentTimeMillis()%>,欢迎您:[${sessionScope.username}]

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    测试预测
    zs只能查看身份认证的按钮内容
    ls、ww可以看权限认证按钮内容
    zdm可以看所有按钮的内容

    测试
    登录张三
    在这里插入图片描述在这里插入图片描述
    登录zdm
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    解决端口占用
    11.8知识总结(web应用程序、手写web框架、Django框架等)
    Tugraph图学习技术详解
    014-JAVA函数定义及return语句的使用
    定时任务动态管理-Scheduled
    java中获取主机信息InetAddress类的两种方法
    设计模式-代理模式
    [极客大挑战 2019]LoveSQL
    通过 while循环体对远程主机进行遍历性ssh登录并执行目标指令
    智能井盖是什么?万宾科技智能井盖传感器有什么特点
  • 原文地址:https://blog.csdn.net/qq_63531917/article/details/126549555