继承这个FormAuthenticationFilter没有重写executeLogin()方法:
时间: 2024-04-15 22:29:48 浏览: 102
使用Filter实现登录权限验证
5星 · 资源好评率100%
抱歉,我之前的回答有误。在SSM + Shiro框架中,你可以继承`FormAuthenticationFilter`,并重写`onAccessDenied()`方法来实现免登录功能。以下是修改后的示例代码:
```java
public class CustomAuthenticationFilter extends FormAuthenticationFilter {
@Override
protected boolean onAccessDenied(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) {
return false; // 认证失败,重定向到登录页面
}
}
}
```
然后,在Shiro配置文件中将自定义过滤器添加到过滤器链中,如下所示:
```xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ...其他配置... -->
<property name="filters">
<map>
<!-- ...其他过滤器配置... -->
<entry key="authc">
<bean class="com.example.CustomAuthenticationFilter">
<!-- 设置登录页的URL -->
<property name="loginUrl" value="/login"/>
</bean>
</entry>
<entry key="user">
<bean class="org.apache.shiro.web.filter.authc.UserFilter"/>
</entry>
</map>
</property>
<property name="filterChainDefinitions">
<value>
/login = anon
/logout = logout
/** = user
</value>
</property>
</bean>
```
通过以上步骤,在拦截器中重写`onAccessDenied()`方法,实现从Cookie中获取sessionId并从Redis中获取账号密码进行Shiro认证。如果认证成功,用户将继续访问原请求页面,否则将重定向到登录页面。
请注意,在实际生产环境中,你需要根据具体情况对Cookie和Redis进行适当的安全性加固和保护。同时,以上代码仅为示例,你可以根据实际需求进行适当调整和扩展。
阅读全文