CustomAuthenticationFilter extends FormAuthenticationFilter这个类返回false为什么还能继续访问
时间: 2023-11-27 11:41:31 浏览: 27
非常抱歉,我之前的回答仍然有误。在Shiro中,`executeLogin()`方法返回`false`并不会停止请求继续访问。正确的做法是通过抛出异常来中断请求并进行相应的处理。
以下是修正后的示例代码:
```java
public class CustomAuthenticationFilter extends FormAuthenticationFilter {
@Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 从Cookie中获取sessionId
String sessionId = null;
Cookie[] cookies = httpServletRequest.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("sessionId".equals(cookie.getName())) {
sessionId = cookie.getValue();
break;
}
}
}
// 从Redis中获取账号密码
Jedis jedis = new Jedis("redis_host", redis_port);
String password = jedis.get(sessionId);
// 调用Shiro的登录方法进行认证
UsernamePasswordToken token = new UsernamePasswordToken(sessionId, password);
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
return true;
} catch (AuthenticationException e) {
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
}
```
在上述代码中,如果认证成功,则返回`true`,允许请求继续访问。如果认证失败,则通过设置`HttpServletResponse`的状态码为`SC_UNAUTHORIZED`(401)来表示未经授权,然后返回`false`,中断请求。
请注意,在实际生产环境中,你还需要根据具体需求进行适当的异常处理和错误页面显示,以及对Cookie和Redis进行适当的安全性加固和保护。同时,以上代码仅为示例,你可以根据实际需求进行适当调整和扩展。