登录失败的 JSON 提示
如果失败了,默认会跳转到Web工程根目录下的/login.jsp页面,可以配置factoryBean.setLoginUrl(“/myLogin”);
认证失败后会跳转到 setLoginUrl 这个方法指定的路径中
FormAuthenticationFilter 是 Shiro 框架中用于处理基于表单的身份验证的过滤器,它简化了身份验证的处理流程,并提供了灵活的配置选项。
FormAuthenticationFilter 是用于处理基于表单的身份验证的过滤器。当用户提交登录表单时,它会拦截请求并
将用户提供的凭证(通常是用户名和密码)传递给 Shiro 进行身份验证。它会使用配置好的身份验证器(如用户名密码验证器)对用户凭证进行验证。如果凭证有效,Filter 将继续处理请求,并将用户身份信息保存在会话中,以便后续的访问控制和授权操作。此外,它还可以根据配置的跳转 URL,将用户重定向到登录成功后的页面。如果凭证无效,FormAuthenticationFilter 将根据配置的错误处理方式,如重定向到登录页面或返回错误信息给用户。Filter 本身提供了可配置的属性,如登录 URL、登录成功 URL、错误 URL 等,以便根据应用程序的需求进行自定义设置。
public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws
Exception {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setStatus(200);
httpServletResponse.setContentType("application/json;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
JSONObject json = new JSONObject();
json.put("state","403");
json.put("msg","登录已失效,请重新登录!");
out.println(json);
out.flush();
out.close();
return false;
}
}
配置过滤器
将自定义过滤器放入 map 中进行注册,如果实现了自定义授权过滤器,那就必须在 shiroFilterFactoryBean 中
进行注册,否则 Shiro 不会使用自定义的授权过滤器
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
LinkedHashMap<String, Filter> map1 = new LinkedHashMap<>();
map1.put("authc", new MyFormAuthenticationFilter());
factoryBean.setFilters(map1); 将过滤器绑定到 shiroFilterFactoryBean 上
Map<String, String> map = new LinkedHashMap<>();
map.put("/logout", "logout");
map.put("/login","anon");
map.put("/**","authc");
factoryBean.setFilterChainDefinitionMap(map);
return factoryBean;
}