一、组成部分
Subject
Subject是shiro的一个接口,接口中定义了很多认证授权的方法。外部应用与subject进行交互,subject记录当前用户。
SecurityManager
SecurityManager是安全管理器,对全部Subject进行管理。以接口形式存在,同时继承了Authenticator、Authorizer和SessionManager。
SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理。
Authenticator
认证器接口,对用户身份进行认证。
Authorizer
通过Authenticator认证器通过认证,在访问功能时通过授权器判断是否有操作权限。
Realm
SecurityManager进行安全认证需要通过Realm获取用户权限数据。Realm可以简单理解为datasource数据源,还有认证授权校验的部分内容。
SessionManager
会话管理,不依赖web容器的session,可以使用在非web应用上。
SessionDAO
会话dao,是对session会话操作的一套接口。例如可以将session存储到数据库。
CacheManager
缓存管理。
Cryptography
shiro提供了一套加解密组件,Cryptography就是密码管理。
二、Shiro认证
自定义Realm
public class UserRealm extends AuthorizingRealm {
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
//从token中 获取用户身份信息
String username = (String) token.getPrincipal();
//拿username从数据库中查询
//....
//返回认证信息由父类AuthenticatingRealm进行认证
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
username, password, getName());
return simpleAuthenticationInfo;
}
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
}
三、Shiro授权
授权方式
Shiro支持三种授权方式:
1、编程式:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
2、注解式:
@RequiresRoles("admin")
public void test() {
//有权限
}
或者:
@RequiresPermissions("visu:list")
public void test() {
//有权限
}
3、页面标签:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
自定义Realm
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// 获取身份信息
String username = (String) principals.getPrimaryPrincipal();
// 根据身份信息从数据库中查询权限数据
//....这里使用静态数据模拟
List<String> permissions = new ArrayList<String>();
permissions.add("user:create");
permissions.add("user:delete");
//将权限信息封闭为AuthorizationInfo
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
for(String permission:permissions){
simpleAuthorizationInfo.addStringPermission(permission);
}
return simpleAuthorizationInfo;
}