为啥我登录后无法进入管理 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见评论。 您的 CustomUserDetailsS​​ervice 需要更新。我认为您需要存储角色登录后。请关注此帖baeldung.com/…

以上是关于为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 REST API 客户端需要 JSONP 请求?

为啥我的rest api post请求不能将我的数组保存在我的mongodb数据库中

无法为 paypal REST API 创建应用程序

成功登录 API 请求后,Angular 会为每个 API 调用触发额外的 OPTION 请求

使用 REST API 进行正确的会话管理

为啥我无法通过官方 Binance REST API 使用 c# 进行 Binance 订单?