为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot
Posted
技术标签:
【中文标题】为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot【英文标题】:Why can't I go to admin REST API request mapping after I have logged in - Spring Boot为什么我登录后无法进入管理 REST API 请求映射 - Spring Boot 【发布时间】:2020-01-14 20:00:15 【问题描述】:我在使用 Spring Boot 和 Spring Security 创建的 REST API 时遇到了一些问题。 首先,我创建了我的 Spring 安全配置。正如您在此处看到的,我有两条具有两种不同授权的路径 - USER 和 ADMIN。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private UserRepository userRepository;
@Bean
public BCryptPasswordEncoder passwordEncoder()
return new BCryptPasswordEncoder();
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
// Set the default standard admin and password as admin, if not exist
User user = userRepository.findByUsername("admin");
if(user == null)
user = new User();
user.setUserID(0);
user.setUsername("admin");
user.setPassword(passwordEncoder().encode("admin"));
Set<Role> roles = new HashSet<Role>();
Role role = new Role();
role.setRoleID(0);
role.setRolename("ADMIN");
roles.add(role);
user.setRoles(roles);
userRepository.save(user);
// Connect our database to spring and also with a password encoder
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable();
http.authorizeRequests().antMatchers("/user/**").authenticated().anyRequest().hasAnyAuthority("ROLE_USER");
http.authorizeRequests().antMatchers("/admin/**").authenticated().anyRequest().hasAnyAuthority("ROLE_ADMIN");
http.httpBasic();
http.formLogin().permitAll();
这是我的用户和管理员控制器。
@RestController
@RequestMapping("/admin")
public class AdminController
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@PostMapping("/addUser")
public String addUser(@RequestBody User user)
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
return "Added user by admin";
@GetMapping("/adminHello")
public String adminHello()
return "Admin say hello";
@RestController
@RequestMapping("/user")
public class UserController
@GetMapping("/userHello")
public String userHello()
return "processing..";
如果我尝试登录http://localhost:8080/login 并输入我的密码和用户名。那我就可以进去了。好吧!
但这些都是问题。
-
如果我使用管理员帐户输入 http://localhost:8080/user/userHello,我仍然会收到“处理中...”
如果我使用管理员帐户输入http://localhost:8080/admin/adminHello,我会得到
"白标错误页面
此应用程序没有显式映射 /error,因此您将其视为后备。 2019 年 9 月 13 日星期五 00:23:42 CEST 出现意外错误(类型=禁止,状态=403)。 禁止”
为什么?我忘记了什么吗?我的帐户在数据库中具有 ADMIN 角色。很清楚。
【问题讨论】:
【参考方案1】:显然您的角色不起作用,配置存在一些问题。
试试这个
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable()
.authorizeRequests()
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.formLogin().permitAll();
【讨论】:
效果更好。管理员帐户无法访问http://localhost:8080/user/userHello
页面 - 403 被禁止。但是管理员账户不能去http://localhost:8080/admin/adminHello
页面 - 403被禁止。
但这不起作用。它只是拒绝我的管理员帐户进入管理员和用户路径。所以它可以达到 50% :)
这是我正在使用的代码。 github.com/Java-Techie-jt/spring-security-jpa/blob/master/src/…
你认为这是正确的吗? pastebin.com/rjDMAyDm见评论。
您的 CustomUserDetailsService 需要更新。我认为您需要存储角色登录后。请关注此帖baeldung.com/…以上是关于为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的rest api post请求不能将我的数组保存在我的mongodb数据库中