Shiro 入门demo

回眸只為那壹抹淺笑 提交于 2020-03-30 20:37:31

 

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 = *

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

 

 

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!