当前位置: 首页 > 知识库问答 >
问题:

SpringBoot 1.5.x+Security+OAuth2

冀耀
2023-03-14

我有一个带有OAuth2安全性的Spring Boot REST API。

今天,我已经将我的spring-boot-starter-parent版本从1.4.2升级到1.5.2

变化完全把我搞糊涂了。

{
  "error": "access_denied",
  "error_description": "Access is denied"
}
security.oauth2.resource.filter-order = 3

然而,我的问题是:

  • 就安全性而言,这两个版本之间发生了什么?
  • 这条“奇怪”的行是唯一有效的修复程序吗?
  • 这个登录页面的目的是什么,它使用的身份验证是什么(我在Google Chrome中检查了一个请求和响应,但我看不到任何访问令牌和oauth2的东西,所以它只使用用户存储库?)

我的代码中一些更重要的部分:

<!--- .... -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>
<properties>
    <!--- .... -->
    <spring-security-oauth.version>2.1.0.RELEASE</spring-security-oauth.version>
    <!--- .... -->
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Monitor features -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>
    <!-- Security + OAuth2 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
        <version>${spring-security-oauth.version}</version>
    </dependency>
<!--- .... -->
#other properties
security.oauth2.resource.filter-order = 3
public class OAuth2 {
@EnableAuthorizationServer
@Configuration
@ComponentScan
public static class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManagerBean;
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("trusted_client")
                .authorizedGrantTypes("password", "refresh_token")
                .scopes("read", "write");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManagerBean).userDetailsService(userDetailsService);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients();
    }
}

@EnableResourceServer
@Configuration
@ComponentScan
public static class ResourceServer extends ResourceServerConfigurerAdapter {

    @Autowired
    private RoleHierarchy roleHierarchy;

    private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
        DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
        defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy);
        return defaultWebSecurityExpressionHandler;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests().expressionHandler(webExpressionHandler())
                .antMatchers("/api/**").hasRole("DEVELOPER");
    }
}
}
@EnableWebSecurity
@Configuration
@ComponentScan
public class Security extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Bean
public JpaAccountDetailsService userDetailsService(AccountsRepository accountsRepository) {
    return new JpaAccountDetailsService(accountsRepository);
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

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

共有1个答案

柴瀚
2023-03-14

好的,我现在拿到了。

@Cleto Gadelha给我提供了非常有用的信息。

然而,我认为发行说明相当不清楚或遗漏了一些信息。除了OAuth2资源筛选器从3更改为securityproperties.access_override_order-1,重要的信息是默认的WebSecurityConfigurerAdapter顺序是100(源代码)。

 类似资料:
  • 问题内容: 我正在慢慢地疯狂尝试配置Spring Security 3.0.0以保护应用程序。 我已将服务器(码头)配置为要求客户端身份验证(使用智能卡)。但是,我似乎无法正确获得applicationContext- security.xml和UserDetailsS​​ervice实现。 首先,从应用程序上下文文件中: UserDetailsS​​ervice看起来像这样: } 该应用程序具有

  • 问题内容: 我需要生成一个证书,但找不到此目录。谢谢! 问题答案: 我相信OS X下jre / lib / security的等效目录是:

  • 问题内容: 我在jsp上安装了CKeditor,并且每当我上传一些内容时,就会弹出以下错误: 我尝试过删除Spring Security,并且一切正常。如何在Spring Security xml文件中禁用此功能?标签之间应该写些什么 问题答案: 默认情况下设置为拒绝,以防止点击劫持攻击。要覆盖它,您可以将以下内容添加到您的spring安全配置中 以下是政策的可用选项 DENY- 是默认值。使用此

  • 我们在Spring Boot中有一个应用程序,使用Spring Security对REST API进行授权和身份验证。 我们有一个正在运行的REDIS服务器,它与spring security一起存储X-AUTH-TOKEN,并将其作为404响应的头参数发送给执行/登录尝试的用户。 然后,这个X-AUTH-TOKEN可以用作头参数来验证其他REST API。 这里的问题是,用户可以复制这个X-AU

  • 问题内容: 我一直在使用Spring Security 3.x来为我的项目处理用户身份验证,到目前为止,它已经完美地工作了。 我最近收到了一个新项目的要求。在此项目中,需要两套用户身份验证:一套用于根据LDAP验证员工,另一套用于根据数据库验证客户。我对如何在Spring Security中进行配置感到有些困惑。 我最初的想法是创建一个具有以下字段的登录屏幕: 单选按钮字段-供用户选择是员工还是客

  • 我在web应用程序中使用Spring Security(v3.1.3)进行X.509身份验证。用户和角色存储在数据库中,但我实际上不需要这样做,因为客户端证书的CNs符合“[角色]-[用户名]”模式,这意味着我已经从证书本身获得了用户名和角色。那么,如何不费吹灰之力就消除数据库呢?我应该编写自己的用户服务实现来填充UserDetails,还是有更优雅的方法?