Shiro 入门demo

2020-03-30 16:03:42来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Shiro 入门demo

 

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

 


原文链接:https://www.cnblogs.com/chy18883701161/p/12596297.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java自学到放弃(小白教程篇)

下一篇:b2b2c系统jwt权限源码分享part1