SpringBoot + layui 框架实现一周免登陆功能
在SpringBoot中实现一周免登录功能,可以通过使用Spring Security和Redis来实现。以下是一个简化的解决方案:
- 使用Spring Security来控制用户认证和授权。
- 使用Redis来存储用户的登录状态,实现无需重复登录的功能。
步骤如下:
- 配置Spring Security,允许部分资源无需认证访问,其余资源需要认证。
- 创建一个自定义的AuthenticationProvider,用于自定义认证逻辑。
- 在认证成功后,将用户信息存储到Redis,并设置一周的过期时间。
- 创建一个拦截器或者过滤器,在请求处理前检查Redis中是否存在有效的登录状态,如果存在则允许访问,否则重定向到登录页面。
以下是核心代码示例:
Spring Security配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 部分资源无需认证访问
.authorizeRequests()
.antMatchers("/assets/**").permitAll()
.anyRequest().authenticated()
// 自定义登录页面
.formLogin().loginPage("/login").permitAll()
.and()
// 其他配置...
}
自定义AuthenticationProvider
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UserDetails userDetails = userDetailsService.loadUserByUsername((String) authentication.getPrincipal());
String userKey = "user:" + userDetails.getUsername();
redisTemplate.opsForValue().set(userKey, "login", 7, TimeUnit.DAYS); // 存储用户状态7天
return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
拦截器
@Component
public class FreeLoginInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String username = getUsernameFromRequest(request);
if (username != null) {
String userKey = "user:" + username;
if (redisTemplate.hasKey(userKey)) {
// 用户状态存
评论已关闭