zoukankan      html  css  js  c++  java
  • Shiro 从.ini文件获取Realm

    1、新建maven项目,引入shiro的核心依赖

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.5.1</version>
        </dependency>

     

    2、在resource下新建shiro.ini

    #定义用户
    [users]
    #用户名=密码,角色。一个用户可以对应多个角色,比如同时是绿钻、黄钻,逗号分隔即可
    chy1 = abcd, common
    chy2 = abcd, vip
    chy3 = abcd, svip
    #定义角色 [roles] #角色
    =权限。可以有多个权限,逗号分隔 common = watch vip = watch,download svip = *

    角色不能使用通配符*,但权限可以使用通配符*,表示该角色具有所有的权限,检测权限的时候能检测出来。

    不能有相同的用户名,有相同的用户名时会自动用这些用户里的最后一个来判断。

    比如先后配置2个用户chy=abcd,chy=1234,验证用户(chy,abcd)时,先列出所有用户名是chy的用户,取最后一个来比较(chy,1234),密码对不上,提示“用户名或密码错误”。

    3、新建实体类User

    public class User {
        private String name;
        private String password;
    
        public User() {
        }
    
        public User(String name, String password) {
            this.name = name;
            this.password = password;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }

    4、新建工具列UserShiro

    public class UserShiro {
    
        /**
         * 指定SecurityManager、Realm,将User包装为Subject
         * @param user 用户
         * @return Subject shiro的认证、授权操作都要先将User包装为Subject,通过Subject来操作
         */
        public static Subject getSubject(User user) {
            //配置SecurityManager。IniSecurityManagerFactory过时了,使用DefaultSecurityManager代替
            DefaultSecurityManager securityManager = new DefaultSecurityManager();
            //.ini文件方式实现的Realm
            IniRealm realm = new IniRealm("classpath:shiro.ini");
            securityManager.setRealm(realm);
    
            //指定要使用的SecurityManager
            SecurityUtils.setSecurityManager(securityManager);
    
            //获取Subject对象
            Subject subject = SecurityUtils.getSubject();
    
            return subject;
        }
    
    
        /**
         * 检查用户是否是指定角色,比如student、teacher、guest,common、vip、svip等
         * @param user 用户
         * @param role 角色
         * @return boolean 该用户是否是指定的角色
         */
        public static boolean hasRole(User user, String role) {
            Subject subject = getSubject(user);
            return subject.hasRole(role);
        }
    
    
        /**
         * 获取用户对应的角色。比如百度网盘登录时在头像处要显示用户的身份标识
         * @param user
         * @return String 用户对应的角色
         */
        public static String getRole(User user){
            Subject subject = getSubject(user);
            String[] allRole = {"common", "vip", "svip"};
            //如果用户同时具有多个角色,比如同时是绿钻、黄钻,可以放在数组、集合中返回
            String role=null;
            for (String ele:allRole){
                if (subject.hasRole(ele)){
                    role = ele;
                    break;
                }
            }
            return role;
        }
    
    
        /**
        检查用户是否具有某项权限、可以执行某项操作,比如下载文件、极速下载
         * @param user 用户信息
         * @param permit 要检查的权限
         * @return boolean 该用户是否具有指定的权限
         */
        public static boolean isPermitted(User user, String permit) {
            Subject subject = getSubject(user);
            return subject.isPermitted(permit);
        }
    
    
        /**
         * 登录检查
         * @param user 用户登录信息
         * @return boolean 登录结果,是否匹配
         */
        public static boolean login(User user) {
            Subject subject= getSubject(user);
    
            //通token封装用户信息
            UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
            try {
                //将token与Realm中的信息进行对比。这个方法的返回值是void,如果找不到匹配,直接抛出异常
                subject.login(token);
            } catch (AuthenticationException e1) {
                //Realm中没有匹配的用户
                return false;
            }
            return true;
        }
    
    
        /**
         * 登出
         */
        public static void logout(User user){
            Subject subject = getSubject(user);
            subject.logout();
        }
    
    }

    5、新建测试类Test

    public class Test {
        
        public static void main(String[] args) {
            User user = new User("chy3", "abcd");
    
            if ( UserShiro.login(user) ){
                System.out.println("登录成功");
                System.out.println("您的身份是:" + UserShiro.getRole(user));
            }
            else {
                System.out.println("用户名或密码错误");
            }
            
        }
        
    }

    6、运行,效果如下

    登录成功
    您的身份是:svip

    一般都是把用户信息、角色、权限存储在数据表中,从表中获取Realm。

    另外,密码一般要加密存储。

  • 相关阅读:
    Python爬取优质高清壁纸网站:彼岸
    xpath爬取喜马拉雅糗事播报音频地址
    Pyquery爬取豆瓣电影Top250
    pipenv虚拟环境
    pip报No module named 'pip'错怎么处理?
    SVN的使用
    测试报告
    软件测试分类
    测试模型
    软件开发过程模型
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12596297.html
Copyright © 2011-2022 走看看