如何在 Spring Boot 安全中配置站点授权? [复制]

Posted

技术标签:

【中文标题】如何在 Spring Boot 安全中配置站点授权? [复制]【英文标题】:How to configure the site authorization in Spring Boot security? [duplicate] 【发布时间】:2019-09-29 10:56:29 【问题描述】:

我在 Spring Boot 安全方面存在一些授权问题。首先在 application.properties 中,输入角色查询,如下所示,

# mysql Queries for AuthenticationManagerBuilder
spring.queries.users-query = SELECT username, password, role FROM blog_user WHERE username=?
spring.queries.roles-query = SELECT username, role FROM blog_user WHERE username=?

我做了 Spring Boot 安全配置

@Configuration
@EnableWebSecurity
public class BlogWebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private DataSource dataSource;

    @Value("$spring.queries.users-query")
    private String usersQuery;

    @Value("$spring.queries.roles-query")
    private String rolesQuery;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        // TODO Auto-generated method stub
        auth.jdbcAuthentication().usersByUsernameQuery(usersQuery).authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource).passwordEncoder(passwordEncoder());
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        // TODO Auto-generated method stub
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/" ,"/home*", "/js/**", "/css/**", "/icon/**", "/users/login", "/users/register").permitAll()
                .antMatchers("/users", "/posts/create", "posts/view", "/tags/create").hasAnyRole("USER") // only .permitAll() method makes it work.
                .anyRequest().authenticated()
                .and() 
            .formLogin()
                .loginPage("/users/login").defaultSuccessUrl("/")
                .usernameParameter("username").passwordParameter("password")
                .and()
            .logout()
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .logoutSuccessUrl("/").and()
            .exceptionHandling().accessDeniedPage("/error/403");
    

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

.hasAnyRole("USER") 线路效果不佳。站点“/users”、“/posts/create”、“posts/view”、“/tags/create”会引发 404 错误。我的意思是我的“用户”角色代码有一些问题。当我将角色方法.hasAnyRole("USER") 更改为.permitAll() 方法时,它就起作用了。如何将正确的授权角色代码放入我的系统?

【问题讨论】:

请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。 对不起我的英语不好。我会尽力使用技术表达。 【参考方案1】:

你的 blog_user 表中的角色值应该以 ROLE_ 为前缀(即它应该是 ROLE_USER)。

Spring Security 4 在检查 hasRole() 时总是添加 ROLE_ 前缀。 有关更多信息,请参阅 Spring security 3 to 4 migration guide。

【讨论】:

以上是关于如何在 Spring Boot 安全中配置站点授权? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot安全设计的配置

在Spring Boot应用程序中配置安全性

如何在 Spring Boot 中设计两个单独的授权/身份验证配置?

如何在spring boot中实现用户级别的特定授权?

如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头

如何在 Spring Boot oauth2 资源服务器中使用自定义身份验证标头