一、基本流程
- 主要依靠过滤器和拦截器来完全登录验证和鉴权
- shiro过滤器链
每一个请求都会有自己的过滤器链,通过配置来完成
二、shiro过滤器
- 基础过滤器:PathMatchingFilter,AdviceFilter,提供一些与具体业务无关的功能性过滤
- 验证过滤器:可以分为两类,
- 是否允许进入系统:登录验证等
- 是否允许访问controller方法:角色,权限等
- 常见的配置
shiro提供的默认可以的过滤器枚举
public enum DefaultFilter {
anon(AnonymousFilter.class),
authc(FormAuthenticationFilter.class),
authcBasic(BasicHttpAuthenticationFilter.class),
logout(LogoutFilter.class),
noSessionCreation(NoSessionCreationFilter.class),
perms(PermissionsAuthorizationFilter.class),
port(PortFilter.class),
rest(HttpMethodPermissionFilter.class),
roles(RolesAuthorizationFilter.class),
ssl(SslFilter.class),
user(UserFilter.class);
}
一般情况的过滤器配置,anno 等就是用的上面相对应的过滤器
- /test.json|anon
- /perms.json|perms[admin]
- /logout|logout
- /login|authc
- /**|user
- 常用过滤器说明
过滤器 | 说明 |
---|---|
FormAuthenticationFilter | 登录验证过滤器,接收用户名,密码完成登录验证,只用于登录请求 |
UserFilter | 验证用户有没登录。 除了一些特殊url(像登录),其他url都应走次过滤器 |
AnonymousFilter | 不做任何验证可以进入系统。主要适用于一些特殊url |
LogoutFilter | 登出操作,只用于登出请求 |
RolesAuthorizationFilter | 验证登入用户的角色,是否可以访问url |
PermissionsAuthorizationFilter | 验证登入用户的权限,是否可以访问url |
PathMatchingFilter | 通过匹配url决定是否进入过滤器。 |
AuthenticatingFilter | 与登录验证相关的过滤器,定义了登录流程 |
AccessControlFilter | 定义了shiro的登录和鉴权流程,其他过滤器是其具体实现 |
- 部分过滤器源码说明
AccessControlFilter
public abstract class AccessControlFilter extends PathMatchingFilter {
//进入业务流程之前验证权限和登录操作
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}
//访问控制,是否允许正常通过过滤器,如已经认证的或不需要认证的请求
protected abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
//对于不允许通过过滤器的请求进行权限验证,像登录逻辑,验证通过后则可通过过滤器
protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return onAccessDenied(request, response);
}
}
三、拦截器
可以说,只用过滤器就可以完成web项目的登录和鉴权功能。拦截器可能在非web上更有用处。这里只简单总结一下
- 通过aop来实现对方法的拦截
- 通过注解来设置权限
注解 | 作用 |
---|---|
RequiresAuthentication | 要求必须是当前登录着的用户 |
RequiresGuest | 要求用户必须是访客 |
RequiresPermissions | 要求用户必须匹配相应的权限 |
RequiresRoles | 要求用户必须匹配相应的角色 |
RequiresUser | 要求必须是该系统的有效的用户(可能曾经登录过,当前并不是登录状态) |