如何为用户和管理员的角色配置不同主页的 Spring Boot 安全性,并为管理员和用户使用单独的控制器

Posted

技术标签:

【中文标题】如何为用户和管理员的角色配置不同主页的 Spring Boot 安全性,并为管理员和用户使用单独的控制器【英文标题】:how to configure Spring Boot Security for Different home Pages for the Role of User and Admin with separate controller for admin and user 【发布时间】:2021-09-10 09:56:56 【问题描述】:

我正在开发 Spring Boot(2.5.2 版)项目。我已经做了安全配置 用于 Thymeleaf 的登录页面。我有一个用于登录页面和关于页面的主控制器。当用户点击登录页面时,我希望用户从主控制器移动到管理控制器或用户控制器 URL,以便根据他们的角色分别在他们的主页上移动。

我在主控制器中设置了 defaultsuccessUrl,我检查了用户角色并尝试根据他的角色将用户重定向到其各自的控制器。但是,url 显示在浏览器中,但管理员或用户控制器没有响应此 url 并且没有显示任何主页。

我尝试了成功处理程序,他们尝试了 response.redirect(url) 但无法成功。如果你们能帮助我,我将非常感激。

请注意,管理员和用户 Thymeleaf 模板页面位于管理员和用户文件夹中。

package com.vu.wcms.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.security.config.annotation.authentication.builders
.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

进口 org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 导入 org.springframework.security.core.userdetails.UserDetailsS​​ervice; 导入 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
@EnableWebSecurity
public class MyConfig extends WebSecurityConfigurerAdapter 

@Bean
public UserDetailsService getUserDetailsService() 
    return new UserDetailsServiceImpl();


@Bean
public BCryptPasswordEncoder passwordEncoder() 
    return new BCryptPasswordEncoder();


@Bean
public DaoAuthenticationProvider authenticationProvider() 
    DaoAuthenticationProvider dao = new DaoAuthenticationProvider();

    dao.setUserDetailsService(getUserDetailsService());
    dao.setPasswordEncoder(passwordEncoder());

    return dao;


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.authenticationProvider(authenticationProvider());


@Override
protected void configure(HttpSecurity http) throws Exception 
   http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .antMatchers("/**").permitAll()
        .and().formLogin()
        .loginPage("/")
        .loginProcessingUrl("/doLogin")
        .defaultSuccessUrl("/successHandler")
        .and().csrf().disable();     




 @GetMapping("/successHandler")
  public String defaultAfterLogin(Authentication authentication) 
   CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();

   String url = "";
   if (userDetails.hasRole("ADMIN")) 
     url = "redirect:/admin/home";
     // return new ModelAndView("redirect:/admin/home");
  else if (userDetails.hasRole("USER")) 
     url = "redirect:/user/home";
 

 // return new ModelAndView("redirect:/user/home");

  return url;

@Controller
@RequestMapping("/admin")
public class AdminController 

@GetMapping("/home")
public String home(Model model) 
     System.out.println("in admin cotnroller");
     model.addAttribute("title", "Admin Home");

     return "admin/home";
 

@Controller
@RequestMapping("/user")
public class UserController 

@GetMapping("/home")
public String home(Model model) 
    System.out.println("in user cotnroller");
    model.addAttribute("title", "User Home");

    return "user/home";

【问题讨论】:

这能回答你的问题吗? Redirect to different page after login based on user role with Spring Security 【参考方案1】:

我找到了这个问题的答案。问题出在下面的代码中。

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers("/admin/**").hasAnyAuthority("ADMIN")
        .antMatchers("/user/**").hasAnyAuthority("USER")
        .antMatchers("/**").permitAll()
        .and().formLogin().loginPage("/").loginProcessingUrl("/doLogin")
        .successHandler(customAuthenticationSuccessHandler)
        .and().logout().permitAll();




  > I was writing hasRole("ADMIN"), but problem solved when i wrote 
   hasAnyAuthority("ADMIN")

【讨论】:

以上是关于如何为用户和管理员的角色配置不同主页的 Spring Boot 安全性,并为管理员和用户使用单独的控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何为多用户 Java 应用程序设计/保留用户角色(当前和已注册)?

如何为 GitHub 组织添加自定义用户角色?

如何为K8S生产系统配置安全管理?

如何为 Rails 中枚举中列出的角色添加模型?

如何为SQL Server2008添加登录账户并配置权限

如何为主页和其他页面创建不同的菜单?