• shiro授权-SSM


    一、授权

    在这里插入图片描述

    先到数据库写好sql语句
    查询身份

    select ur.roleid from t_shiro_user u,t_shiro_user_role ur where  u.userid=ur.userid and u.username='zdm'
    
    • 1

    查询权限

    select perid from t_shiro_user u,
    t_shiro_user_role ur,
    t_shiro_role_permission sp 
    where u.userid=ur.userid
    and ur.roleid=sp.roleid
    and u.username='ls'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    usermapper.xml添加

    
    
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    usermapper

    //     角色
        Set selectRoleByUserName(String userName);
    //      权限
        Set selectPerByUserName(String userName);
    
    • 1
    • 2
    • 3
    • 4

    userbizipml

    @Override
        public Set selectRoleByUserName(String userName) {
            return userMapper.selectRoleByUserName(userName);
        }
    
        @Override
        public Set selectPerByUserName(String userName) {
            return userMapper.selectPerByUserName(userName);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    修改一下shiro.xml的东西

      /user/login=anon
                    /user/updatePwd.jsp=authc
                    /admin/*.jsp=roles[4]
                    /user/teacher.jsp=perms[2]
    
    • 1
    • 2
    • 3
    • 4

    重写授权的方法

    /**
         * 授权
         * @param princi
         * @return
         * 替代lweb-shiro.ini
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection princi) {
    
            System.out.println("授权方法。。。。。。。");
            //拿到登录的用户名
            String userName = princi.getPrimaryPrincipal().toString();
            //根据用户名查询用户
            User user = userbiz.queryByName(userName);
            //查询角色
            Set roles = userbiz.selectRoleByUserName(userName);
            //查询权限
            Set pers = userbiz.selectPerByUserName(userName);
    
            SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
            info.setRoles(roles);
            info.setStringPermissions(pers);
            return info;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    运行结果:
    我们使用zdm登录,管理员的身份
    在这里插入图片描述

    在这里插入图片描述
    然后我们再用zs登录:普通用户
    在这里插入图片描述

    在这里插入图片描述

    二、注解式开发

    常用注解介绍

    @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

    注解的使用

    package com.yzp.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;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * @author易泽鹏
     * @site 16670388677
     * @company
     * @create  2022-08-26 18:40
     */
    @RequestMapping("/shiro")
    @Controller
    public class ShiroController {
    
        //RequiresUser是代表当前方法只有登录后才能访问
    //    RequiresUser等价与applicationContext-shiro.xml中的/user/updatePwd.jsp=authc配置
        @RequiresUser
        @RequestMapping("/passUser")
        public  String passUser(HttpServletRequest request){
            System.out.println("身份认证通过。。。。。。");
            return "admin/addUser";
        }
    
    //    RequiresRoles是当前方法只有具备指定的角色才能访问
    //    RequiresRoles等价于/admin/*.jsp=roles[4]配置
        @RequiresRoles(value = {"1","4"},logical = Logical.AND)
        @RequestMapping("/passRole")
        public String passRole(HttpServletRequest request){
            System.out.println("角色认证通过。。。。。");
            return "admin/addUser";
        }
    
        @RequiresPermissions(value = {"2"},logical = Logical.AND)
        @RequestMapping("/permission")
        public String permission(HttpServletRequest request){
            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

    spring-mvc.xml配置

    
        
    
    
        
    
    
    
        
            
                
                    unauthorized
                
            
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果:
    没登录他会报错
    在这里插入图片描述

    使用zdm登录
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    角色认证结果:
    我们用zs登录,因为zs只有普通用户的权限所有无法访问
    在这里插入图片描述
    我们使用zdm登录即可访问因为只有zdm符合角色1和角色4
    在这里插入图片描述
    在这里插入图片描述
    permission
    权限方法运行结果
    只有拥有新增用户权限的才能访问
    zdm登录可以访问
    在这里插入图片描述
    zs登录没有资格
    在这里插入图片描述

  • 相关阅读:
    【Docker的安装和基础命令】
    CDH集群集成外部Flink(改进版-与时俱进)
    Java算法 每日一题(五) 编号209:长度最小的子数组
    原型-设计模式
    NSSCTF做题(3)
    HBuilderX选择主题以及自定义主题教程
    21天学习第五天--数组
    基于改进灰狼优化算法的边缘计算任务调度方法
    Docker系列第05部分:实战部署应用全流程
    Vue路由的使用
  • 原文地址:https://blog.csdn.net/m0_65795902/article/details/126549414