基于角色的登录

本文展示了如何根据不同的用户角色,在登录之后来重定向到不同的页面。

method-security项目的基础上,我们构建了一个role-base-login项目。

build.gradle

修改 build.gradle 文件,让我们的role-base-login项目成为一个新的项目。

修改内容也比较简单,修改项目名称及版本即可。

  1. jar {
  2. baseName = 'role-base-login'
  3. version = '1.0.0'
  4. }

权限处理器

新增com.waylau.spring.boot.security.auth包,用于存放权限处理器相关的类。

新建 AuthenticationSuccessHandler ,继承自 org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler

  1. @Component
  2. public class AuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
  3. private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
  4. @Override
  5. public void handle(HttpServletRequest request, HttpServletResponse response,
  6. Authentication authentication) throws IOException, ServletException {
  7. String targetUrl = determineTargetUrl(authentication);
  8. if (response.isCommitted()) {
  9. logger.debug("Response has already been committed. Unable to redirect to "
  10. + targetUrl);
  11. return;
  12. }
  13. redirectStrategy.sendRedirect(request, response, targetUrl);
  14. }
  15. private String determineTargetUrl(Authentication authentication) {
  16. String targetUrl = null;
  17. Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
  18. List<String> roles = new ArrayList<String>();
  19. for (GrantedAuthority a : authorities) {
  20. roles.add(a.getAuthority());
  21. }
  22. // 根据不同的角色,重定向到不同页面
  23. if (isAdmin(roles)) {
  24. targetUrl = "/admins";
  25. } else if (isUser(roles)) {
  26. targetUrl = "/users";
  27. } else {
  28. targetUrl = "/403";
  29. }
  30. return targetUrl;
  31. }
  32. private boolean isUser(List<String> roles) {
  33. if (roles.contains("ROLE_USER")) {
  34. return true;
  35. }
  36. return false;
  37. }
  38. private boolean isAdmin(List<String> roles) {
  39. if (roles.contains("ROLE_ADMIN")) {
  40. return true;
  41. }
  42. return false;
  43. }
  44. }

重写了 handle()方法,这个方法简单地使用 RedirectStrategy 来重定向,由自定义的 determineTargetUrl 方法返回URL。此方法提取当前认证对象用户记录的角色,然后构造基于角色有相应的URL。最后由负责 Spring Security 框架内的所有重定向的 RedirectStrategy ,将请求重定向到指定的URL。

修改配置类

在配置类中,添加成功认证的处理器 AuthenticationSuccessHandler 的实例:

  1. .formLogin() //基于 Form 表单登录验证
  2. .loginPage("/login").failureUrl("/login-error") // 自定义登录界面
  3. .successHandler(authenticationSuccessHandler)

运行

当我们使用“ADMIN”角色的用户登录成功后,会被重定向到/admins页面。而使用“USER”角色的用户登录成功后,会被重定向到/users页面。