先介绍一下常用的拦截器
有关认证的拦截器:
拦截器名 | 默认拦截器类 | 说明 |
---|---|---|
authc | FormAuthenticationFilter | 需要认证才可以访问–主要属性:loginUrl:登录的url,默认login.jsp,如果被这个过滤器拦截后,会重定向这个url,successUrl:登录成功后重定向的url |
user | UserFilter | 需要认证或记住我才可以访问 |
logout | LogoutFilter | 退出url主要属性:redirectUrl:退出后重定向的url,默认"/“如设置”/logout=logout"后,当访问/logout会被拦截,执行退出,再重定向到redirectUrl |
anon | AnonymousFilter | 不拦截,总会放行 |
有关授权的拦截器:
拦截器名 | 默认拦截器类 | 说明 |
---|---|---|
roles | RolesAuthorizationFilter | 验证当前用户是否拥有所有角色,,主要属性:unauthorizedUrl:未授权重定向的urlloginUrl:登录页面的url如配置"/admin/**=roles[user,admin]"则访问/admin/时,如果该用户没有同事拥有user和admin两种角色,则重定向到unauthorizedUrl |
perms | PermissionsAuthorizationFilter | 验证当前用户是否拥有所有权限,主要属性和roles一致 |
我们认证选用user拦截器,授权选用perms
1.写一个自定义过滤器用来认证
public class ShiroLoginFilter extends UserFilter {
//Shiro 认证失败返回JSON
@Override
protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8");
//JsonResult 为自己写的封装返回信息类下面有
response.setContentType("application/json; charset=utf-8");
String json = ObjectMapperUtil.toJson(new JsonResult(0, "请登录", null)); //ObjectMapperUtil为自己写的工具类 下面有
response.getWriter().print(json);
}
}
2.写一个自定义过滤器用来授权
public class ShiroRoleFilter extends PermissionsAuthorizationFilter {
//Shiro 没有权限失败返回JSON
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
Subject subject = getSubject(request, response);
if (subject.getPrincipal() == null) {
//跳转至登录页
saveRequestAndRedirectToLogin(request, response);
} else {
//给前端提示无接口访问权限的错误码
saveRequestAndReturnApiAccessError(request, response