名词解释
授权,也叫访问控制,即在应用中控制谁能访问哪些资源,关于授权有下面几个需要了解的对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)
- 主体(Subject):访问应用的用户,在 Shiro 中使用 Subject 代表该用户。
- 资源(Resource):在应用中用户可以访问的任何东西,用户授权
- 权限(Permission):权限表示在应用中用户能不能访问、操作某个资源
- 角色代表了操作集合,可以理解为权限的集合, 不同的角色拥有一组不同的权限。如普通用户,管理员用户都是角色,用户会拥有所属角色拥有的所有权限。
角色
通过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,也可以自己定义,上面这样的是基于角色的访问控制,还有基于资源的访问访问控制。
网友评论