Shiro是Apache的开源安全框架,提供了登录认证,授权,加密,会话管理,缓存管理等功能。
核心概念
Shiro包含了如下三个核心概念:
- Subject:主体,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是其他的程序。Subject 代表了当前用户的安全操作,SecurityManager 则管理所有用户的安全操作。
- SecurityManager:安全管理器,管理着所有的Subject,是Shiro的核心,与其他组件交互,例如会话管理,缓存管理
- Ream:意思为领域或者国度。起到一个桥梁的作用,主要通过realm来获取用户相关的安全数据,例如获取用户在数据库中的密码信息,角色信息,操作权限信息等。Shiro内置了2个Realm,分别是IniRealm和JdbcRealm,但是不常用,一般情况下都需要我们自己来自定义实现。
一般我们需要继承 org.apache.shiro.realm.AuthorizingRealm,然后实现其中父类的2个抽象方法。
// 自定义Realm
public class CustomRealm extends AuthorizingRealm {
// 授权,验证用户的角色和操作权限
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//....
}
// 认证,验证登录的用户名和密码是否正确
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//....
}
}
整体流程
用户通过Subject来进行认证和授权,而Subject又委托给SecurityManager,而SecurityManager又需要通过我们自定义的Realm来获取密码,权限等数据来进行校验和比对
过滤器
Shiro还提供了过滤器,可以配置我们的过滤规则,过滤规则对顺序是有要求的,短路优先原则,也就是前面的适配成功之后,就不会再适配后面的规则了。
/user/**=anon
/user/list=authc 永远不会执行
过滤规则说明:
其中anon
、authc
等为Shiro为我们实现的过滤器,具体如下表所示:
Filter Name | Class | Description |
---|---|---|
anon | org.apache.shiro.web.filter.authc.AnonymousFilter | 匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例/static/**=anon
|
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter | 基于表单的拦截器;如/**=authc ,如果没有登录会跳到相应的登录页面登录 |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter | Basic HTTP身份验证拦截器 |
logout | org.apache.shiro.web.filter.authc.LogoutFilter | 退出拦截器,主要属性:redirectUrl:退出成功后重定向的地址(/),示例/logout=logout
|
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter | 不创建会话拦截器,调用subject.getSession(false) 不会有什么问题,但是如果subject.getSession(true) 将抛出DisabledSessionException 异常 |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter | 权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例/user/**=perms["user:create"]
|
port | org.apache.shiro.web.filter.authz.PortFilter | 端口拦截器,主要属性port(80) :可以通过的端口;示例/test= port[80] ,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样 |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter | rest风格拦截器,自动根据请求方法构建权限字符串;示例/users=rest[user] ,会自动拼出user:read,user:create,user:update,user:delete权限字符串进行权限匹配(所有都得匹配,isPermittedAll) |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter | 角色授权拦截器,验证用户是否拥有所有角色;示例/admin/**=roles[admin]
|
ssl | org.apache.shiro.web.filter.authz.SslFilter | SSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口443;其他和port拦截器一样; |
user | org.apache.shiro.web.filter.authc.UserFilter | 用户拦截器,用户已经身份验证/记住我登录的都可;示例/**=user
|
我们也可以自定义实现过滤器,如果是授权相关,则继承org.apache.shiro.web.filter.authz.AuthorizationFilter,如果是认证则继承AuthenticatingFilter