Spring security登录授权用户有效期简单例子
Posted zhangphil
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring security登录授权用户有效期简单例子相关的知识,希望对你有一定的参考价值。
在上一个例子基础上:
https://zhangphil.blog.csdn.net/article/details/122489213https://zhangphil.blog.csdn.net/article/details/122489213加入一些简单改造,任何登录授权用户会给一个登录后的有效期,超时后,当前用户需要重新登录认证。这种场景就是常见的网页和app的“记住我”(记住用户名和密码)功能,“记住我”的时间可以通过spring的rememberMe()完成。
修改的代码:
@Autowired
private UserDetailsService mUserDetailServiceImpl; // 用户服务
@Bean
public PersistentTokenRepository persistentTokenRepository()
return new InMemoryTokenRepositoryImpl();
@Override
public void configure(HttpSecurity http) throws Exception
http
.formLogin() //登录
//.failureUrl("/error") //成功登陆后跳转页面
.failureHandler(new AuthenticationFailureHandler()
@Override
public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception)
resp.setContentType("application/json;charset=utf-8");
PrintWriter out = null;
try
out = resp.getWriter();
catch (IOException e)
e.printStackTrace();
out.write("登录失败");
out.flush();
out.close();
)
.successHandler(new AuthenticationSuccessHandler()
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException
System.out.println(authentication.getName() + " 登录成功");
//重定向
response.sendRedirect("/index");
)
.and().rememberMe()
.userDetailsService(mUserDetailServiceImpl)
.tokenRepository(persistentTokenRepository()) // 设置数据访问
.tokenValiditySeconds(5); // 记住我,有效期(秒)
http
.authorizeRequests() // 配置认证与授权
.antMatchers("/user/**").hasRole(USER) //基于角色
//.antMatchers("/user/**").hasAuthority("p1") 基于权限
.antMatchers("/admin/**").hasRole(ADMIN) //基于角色
//.antMatchers("/admin", "/admin/**").hasAuthority("p2") 基于权限
//.hasAnyAuthority("admin,manager") 只要有任意一个权限就可访问, 多个权限逗号分隔
//.anyRequest().authenticated() //需授权才能访问。
.and();
//注销登录,退出当前用户
http.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(new LogoutSuccessHandler()
@Override
public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException
resp.sendRedirect("/login");
)
.logoutSuccessUrl("/login")
//.permitAll()
.and();
启用rememberMe()后,spring默认的login页面自动出现“记住我”的选择框。勾选后,在代码里面启动计时功能,超时后,用户登录失效。
简单期间,本例使用的token实现是基于内存的,常规做法是通过Jdbc那样的数据库存储“记住我”的token。
以上是关于Spring security登录授权用户有效期简单例子的主要内容,如果未能解决你的问题,请参考以下文章
基于 Spring Boot / Spring Security 角色的授权无法正常工作 [重复]
Spring Security OAuth2.0认证授权介绍