Spring Boot中的JDBC授权[重复]

Posted

技术标签:

【中文标题】Spring Boot中的JDBC授权[重复]【英文标题】:JDBC authorization in Spring Boot [duplicate] 【发布时间】:2018-02-11 10:51:23 【问题描述】:

我正在尝试使用 JDBC (mysql) 设置简单的身份验证和授权。这是我用来初始化用户的 sql:

INSERT INTO users(username,password,enabled)
VALUES ('admin','admin', true);
INSERT INTO user_roles (username, role)
VALUES ('admin', 'USER');
INSERT INTO user_roles (username, role)
VALUES ('admin', 'ADMIN');

数据源属性:

spring.datasource.password=xxxx 
spring.datasource.url=jdbc:mysql://localhost:3306/spring
spring.datasource.username=xxx

安全配置:

 class ApplicationSecurity extends WebSecurityConfigurerAdapter 

    @Autowired
    private DataSource source;

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests().antMatchers("/uploadfiles/**").access("hasRole('ADMIN')");
        http.authorizeRequests().antMatchers("/fonts/**").permitAll();
        http.authorizeRequests().antMatchers("/").permitAll();
        http.authorizeRequests().anyRequest().fullyAuthenticated().and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/").failureUrl("/login?error").permitAll().and()
                .logout().permitAll();
    

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.jdbcAuthentication().dataSource(source).
                usersByUsernameQuery("select username,password,enabled from users where username=?").
                authoritiesByUsernameQuery("select username, role from user_roles where username=?");
    


登录效果很好,但是当尝试以管理员身份打开 /uploadfiles 链接时,我得到 403 响应。我还尝试检查角色是否正确,它们是否正确。我使用以下代码检查了它们:

Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>)    SecurityContextHolder.getContext().getAuthentication().getAuthorities();
            authorities.forEach(authority -> logger.info(authority.toString()));

当我设置 inMemoryAuthentication 时,它也按预期工作,所以我猜它必须与 mysql 配置有关。有人在我的代码中看到错误吗?

【问题讨论】:

您的role 列是否包含权限('ADMIN')或角色('ROLE_ADMIN')? 它是'ADMIN'、'USER'等,没有任何前缀。 【参考方案1】:

将您的权限 SQL 查询修改为:

select username, concat('ROLE_',role) from user_roles where username=?

角色是以“ROLE_”为前缀的权限。

【讨论】:

以上是关于Spring Boot中的JDBC授权[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:在使用 Hibernate、JDBC 和 MySQL 几个小时不活动后通信链接失败 [重复]

带有嵌入式 Tomcat 的 Jndi Mongodb Spring Boot,[重复]

Spring Boot:禁用 Spring Boot 单元测试的安全性 [重复]

INSERT 语句上的 Spring JDBC NullPointerException [重复]

具有不同键的 Spring Boot 应用程序属性[重复]

Spring:jdbc模板中的上一行[重复]