shiro quickstart 分析

32 阅读1分钟

1. 背景

通常我在开发shiro的时候,我会通过自己的demo来先实现一下功能,至此记录一下demo的分析使用

2. 使用demo

2.1 配置角色和权限,代码中获取和判断

shiro.ini 配置项

# users 下面都是用户名、密码配置,角色配置
[users]
zhangsan=123456,admin,manager
lisi=123456,guest

#roles 下面都是角色、权限配置, * 是拥有所有权限, user:add就是一个字符串, user:add,update,delete这些都是权限
[roles]
admin=add
manager=delete
guest=user:add,update,delete
/**
 * 测试代码
 */
public class Quickstart {

    private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);

    public void login(String fileName) {

        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:" + fileName );
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        //获取当前的用户对象Subject,threadlocal
        Subject currentUser = SecurityUtils.getSubject();


        if (currentUser.isAuthenticated()) {
            log.info("已经登录");

        } else {
            log.info("未登录");

            String userName = "zhangsan";
            String pwd = "123456";
            UsernamePasswordToken token = new UsernamePasswordToken(userName, pwd);
            try {
                currentUser.login(token);
            } catch (UnknownAccountException e) {
                log.info("用户名:{} 不正确", userName, e);
            } catch (IncorrectCredentialsException e) {
                log.info("密码:{}不正确", pwd, e);
            }
            if (currentUser.isAuthenticated()){
                log.info("用户名:{}, 密码:{}", currentUser.getPrincipal(), new String(((char[])token.getCredentials())));
                log.info("用户名:{}, 密码:{}", currentUser.getPrincipal(), new String(token.getPassword()));

            }else {
                log.info("登录报错");
            }
        }

    }

    @Test
    public void testRole(){
        login("shiro.ini");
        log.info("当前用户:{}", getSubject().getPrincipal());

        if (getSubject().hasRole("admin")){
            log.info("当前用户:{},拥有角色:{}", getSubject().getPrincipal(), "admin");
        }

        List<String> roleList = Arrays.asList("adminx", "managerx");
        if (getSubject().hasAllRoles(roleList)){
            log.info("当前用户:{},拥有角色:{}", getSubject().getPrincipal(), roleList);
        } else {
            log.info("当前用户:{},不拥有角色:{}", getSubject().getPrincipal(), roleList);
        }

        boolean[] hasRoles = getSubject().hasRoles(roleList);
        for (boolean hasRole : hasRoles) {
            log.info("hasRole:{}", hasRole);
        }

        try {
            getSubject().checkRole("admin");
            getSubject().checkRoles("admin", "adminx");
        }catch (Exception e){
            log.error("error:{}", e);
        }
    }


    @Test
    public void testPermission(){
        login("shiro.ini");
        log.info("当前用户:{}", getSubject().getPrincipal());

        if (getSubject().isPermitted("add")) {
            log.info("当前用户:{} 拥有权限:{}", getSubject().getPrincipal(), "add");
        }
        boolean[] permitted = getSubject().isPermitted("add", "delete");
        for (boolean permit : permitted) {
            log.info("permit:{}", permit);
        }



    }


    @After
    public void logout(){
        log.info("退出登录");
        SecurityUtils.getSubject().logout();
    }


    public Subject getSubject(){
        return SecurityUtils.getSubject();
    }
}