Shiro的角色、权限ini配置

2018-08-24  本文已影响18人  tingshuo123

名词解释

授权,也叫访问控制,即在应用中控制谁能访问哪些资源,关于授权有下面几个需要了解的对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)

角色

通过ini文件中配置角色
shiro-role.ini:

[users]
zhang=123,role1,role2
wang=123,role1

由上可知为用户添加角色的规则就是:"用户名=密码,角色1,角色2"

测试用例:
基础测试类 BaseTest

package chapter3;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.apache.shiro.util.ThreadContext;
import org.junit.After;

public class BaseTest {

    @After
    public void tearDown() {
        ThreadContext.unbindSubject();
    }
    
    // 验证用户
    protected void loing(String configFile, String username, String password) {
        // 获取SecurityManager工厂
        Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(configFile);

        // 获通过工厂获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();

        // 将实例绑定给SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);

        // 获取Subject
        Subject subject = SecurityUtils.getSubject();

        // 创建Token
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        // 登录(验证用户)
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            // 验证失败
            e.printStackTrace();
        }

        if (subject.isAuthenticated()) {
            System.out.println("登录成功!!!");
        }
    }
    

    // 获取subject对象
    public Subject subject() {
        return SecurityUtils.getSubject();
    }
}

后面的测试类都会继承它。

角色测试

public class RoleTest extends BaseTest{

    
    @Test
    public void testHasRole() {
        String configFile = "classpath:shiro-role.ini";
        String username = "zhang";
        String password = "123";
        
        this.loing(configFile, username, password);
        
        // 判断是否属于单个角色
        Assert.assertTrue(this.subject().hasRole("role1"));
        // 判断是否拥有多个角色
        Assert.assertTrue(this.subject().hasAllRoles(Arrays.asList("role1", "role2")));
    }
}

权限

通过ini文件中配置角色及权限

[users]
zhang=123,role1,role2
wang=123,role1
[roles]
role1=user:create,user:update
role2=user:create,user:delete

权限测试

public class PerdmissionTest extends BaseTest {
    
    @Test
    public void testIsPermitted() {
        
        this.loing("classpath:shiro-primission.ini", "zhang", "123");
        // 判断是否拥有单个权限
        Assert.assertTrue(this.subject().isPermitted("user:create"));
        // 判断是否拥有多个个权限
        Assert.assertTrue(this.subject().isPermittedAll("user:create", "user:update"));
    }
}

Shiro有默认实现的Realm,也可以自己定义,上面这样的是基于角色的访问控制,还有基于资源的访问访问控制。

上一篇下一篇

猜你喜欢

热点阅读