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();
}
}