如何为用户和管理员的角色配置不同主页的 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.UserDetailsService; 导入 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 安全性,并为管理员和用户使用单独的控制器的主要内容,如果未能解决你的问题,请参考以下文章