Apache Shiro
目录简介
Apache Shiro:Java 安全框架
功能:
- 认证 Authentication
- 授权 Authorization
- 加密 Crytography
- 会话管理 Session Management
概念:
- Subject
- Security Manager
- Realm(数据源)
API
权限配置 shiro.ini
:
# 用户和角色
[users]
# 用户 root,密码 secret,角色 admin
root = secret, admin
guest = guest, guest
skroob = 12345, president
# 用户 docker,密码 12345,角色 admin, container
docker = 12345, admin, container
# 角色和权限
[roles]
# admin 拥有所有权限
admin = *
# author 拥有博客下的所有权限
author = blog:*
# action:type:instace id
goodguy = winnebago:drive:eagle5
创建 SecurityManager:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
获取当前用户(未登录匿名用户):
Subject user = SecurityUtils.getSubject();
获取用户会话:
Session session = user.getSession();
session.setAttribute("key", "value");
用户登录:
if (!user.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("username", "password");
token.setRemenberMe(true);
user.login(token);
}
捕获登录异常:
try {
user.login(token);
} catch(UnknownAccountException e) {
// 用户名不存在
} catch(IncorrectCredentialsException e) {
// 密码错误
} catch(LockedAccountException e) {
// 用户被锁定
} catch (AuthticationException e) {
// 其他异常
}
安全最佳实践:登录失败是,不要给用户返回过于详细的信息(比如,账号不存在、密码错误),避免被黑客恶意利用
获取用户名:
user.getPrincipal();
检查用户角色:
if (user.hasRole("admin")) {}
检查用户权限:
if (user.isPermitted("file:write")) {}
用户登出并清除会话:
user.logout();