• Shiro授权以及注解开发


    一,shiro授权角色,权限

    sql语句

    --角色:用户具备哪些角色
    select roleid FROM t_shiro_user u,t_shiro_user_role ur where u.userid = ur.userid and u.username = 'zdm'
     
     
     
    --权限:用户具备的权限
    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 = 'ls'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    在这里插入图片描述
    2.自动生成xml文件配置

    
     
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Service层编写

    package com.zhouzhou.ssm.Biz;
     
    import com.zhouzhou.ssm.model.User;
    import org.apache.ibatis.annotations.Param;
     
    import java.util.Set;
     
    public interface UserBiz {
       
        Set selectRolesByUserName (String userName);
     
        Set selectgetPersByUserName(String userName);
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    实现类

    package com.dengxiyan.ssm.Biz.impl;
     
    import com.dengxiyan.ssm.Biz.UserBiz;
    import com.dengxiyan.ssm.mapper.UserMapper;
    import com.dengxiyan.ssm.model.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import java.util.Set;
     
    **
     * @author周周
     * @company zsm
     * @create  2022-08-25 15:39
     */
     
    @Service("userBiz")
    public class UserBizImpl implements UserBiz {
     
        @Override
        public Set selectRolesByUserName(String userName) {
            return userMapper.selectRolesByUserName(userName);
        }
     
        @Override
        public Set selectgetPersByUserName(String userName) {
            return userMapper.selectgetPersByUserName(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

    注意:角色与权限的结果要与spring-shiro.xml中的配置保持一致

    package com.zhouzhou.ssm.shiro;
     
    import com.zhouzhou.ssm.Biz.UserBiz;
    import com.zhouzhou.ssm.mapper.UserMapper;
    import com.zhouzhou.ssm.model.User;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
     
    import java.util.Set;
     
    **
     * @author周周
     * @company zsm
     * @create  2022-08-25 15:39
     */
    public class MyRealm extends AuthorizingRealm {
     
        private UserBiz userBiz;
     
     
        public UserBiz getUserBiz() {
            return userBiz;
        }
     
        public void setUserBiz(UserBiz userBiz) {
            this.userBiz = userBiz;
        }
     
        /**
         * 授权
         * @param principals
         * @return
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            System.out.println("用户授权~~~");
            String username = principals.getPrimaryPrincipal().toString();//获取用户名
            Set roles = userBiz.selectRolesByUserName(username);
            Set pers = userBiz.selectgetPersByUserName(username);
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //将当前登入的 权限 交给 shiro的授权器
            info.setStringPermissions(pers);
            //将当前登录的 角色 交给 shiro授权器
            info.setRoles(roles);
            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
    • 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

    二,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       --------(权限配置)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用

    Controller层

    对应的注解添加到指定需要权限控制的方法上

    package com.zhouzhou.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;
     
    import javax.servlet.http.HttpServletRequest;
     
    **
     * @author周周
     * @company zsm
     * @create  2022-08-25 19:39
     */
    @Controller
    public class ShiroController {
     
        //表示登入后才可以访问   等价于Spring-shiro.xml中的user/updatePwd.jsp=配置
        @RequiresUser
        @RequestMapping("/passUser")
        public String passUser(HttpServletRequest request){
            return "admin/addUser";
        }
     
    //    @RequiresRoles 当前方法只有 具备指定的角色才能访问
    //    相当于spring-shiro.admin/*.jsp=roles[4]配置
        @RequiresRoles(value = {"1","4"},logical = Logical.AND)
        @RequestMapping("/passRole")
        public String passRoles(HttpServletRequest request){
            System.out.println("角色验证通过");
            return "admin/addUser";
        }
     
    //    @RequiresPermissions 当前方法只有具备指定的权限 才能够访问
    //    等价于Spring-shiro.xml中的user/teacher.jsp=perms配置
    //    @RequiresPermissions(value = {"user:update","user:view"},logical = Logical.OR)
        @RequiresPermissions(value = {"2"},logical = Logical.AND)
        @RequestMapping("/passPer")
        public String passPer(HttpServletRequest request){
            System.out.println("权限通过验证");
            return "admin/addUser";
        }
     
        @RequestMapping("/unauthorized")
        public String unauthorized(){
            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

    Spring-mvc.xml配置

    添加拦截器相关配置

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

    jsp界面(测试)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@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

    效果图展示

    标记处:由于每个用户的权限不同,有的用户有该权限,有的用户没有
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Ubuntu 22.04 安装水星无线 USB 网卡
    Mybatis02
    Qt 二维码生成与识别
    大数据—数据透析表常见使用(手把手详解)
    Android设计模式--责任链模式
    方差、协方差的几何理解
    Java入门,最全面最简单的Java基础教程
    计算C语言字符串长度的方法与区别
    苍穹外卖——项目搭建
    32岁事业无成,我终于选择放过自己了
  • 原文地址:https://blog.csdn.net/zsm030616/article/details/126660461