Oauth 和 Spring 安全性

Posted

技术标签:

【中文标题】Oauth 和 Spring 安全性【英文标题】:Oauth and Spring Security 【发布时间】:2015-03-05 09:56:57 【问题描述】:

我有一个服务器端应用程序,它有两个部分。第一部分是 REST API,另一部分是网页仪表板,用于管理整个服务器端应用程序。

现在我使用 Oauth 和 spring security 来保护 REST apis 和 Spring security 的基于表单的身份验证来保护网页仪表板。 但是使用基于表单的身份验证会与 oauth 配置发生冲突。

有没有办法在 Spring 安全性中同时使用 Oauth 和基于表单的身份验证?

这是安全配置文件。我尝试添加两个配置,但没有成功,所以我尝试了这个配置有两个安全标签。此处表单登录配置工作正常,但用于 oauth 的其他配置不起作用。我能够获取访问令牌但 oauth 不起作用,并且在尝试访问 REST API 时,我被重定向到仪表板登录页面。

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

private static final Logger LOG = Logger.getLogger(SecurityConfiguration.class);

@Autowired
UserDetailsService webUserDetailsService;



BCryptPasswordEncoder passwordEncoder;

public SecurityConfiguration()
    LOG.debug("OAuthSecurityConfiguration initialized");

    passwordEncoder = new BCryptPasswordEncoder();

    LOG.debug(passwordEncoder);


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception 


    auth
        .userDetailsService(webUserDetailsService)
        .passwordEncoder(passwordEncoder);
    LOG.debug("user and password details");
    LOG.debug( auth
        .userDetailsService(webUserDetailsService)
        .passwordEncoder(passwordEncoder));


@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception 

    LOG.debug("authenticationManagerBean");

    return super.authenticationManagerBean();




@Configuration
@EnableResourceServer
@ComponentScan(basePackages = "**")
@Order(1)                                                        
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter 


    public void configure(ResourceServerSecurityConfigurer resources) 
        LOG.debug(resources);
        resources.resourceId("admin");
        resources.resourceId("admin");
        LOG.debug("configureresource:"+resources.resourceId("admin"));
    

    protected void configure(HttpSecurity http) throws Exception 
        http
            .antMatcher("..")                   
            .authorizeRequests()               
                .anyRequest().hasRole("ADMIN");
                .and()
            .httpBasic();
    


@Configuration  
@ComponentScan(basePackages = "**")
@Order(2)
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
        .csrf().disable()
        .authorizeRequests()
         .antMatchers("/login"
                    ).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin().loginPage("/login/new")
          .defaultSuccessUrl("/**", true)
            .failureUrl("/login/fail")
                .permitAll()
           .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login/new")                                  
            .permitAll();
    ;
    

【问题讨论】:

见:projects.spring.io/spring-security-oauth 【参考方案1】:

here 提供的 sparklr 示例很好地涵盖了这一点,请参阅 OAuth2ServerConfig 类。

在您的资源服务器配置类(扩展ResourceServerConfigurerAdapter)中:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter 

    @Override
    public void configure(HttpSecurity http) throws Exception 
        http
            .authorizeRequests()
                .antMatchers("/api/**").access("#oauth2.hasScope('some_oauth_scope') or (!#oauth2.isOAuth() and hasRole('ROLE_ADMIN'))")
            // Enable form login 
            .and().formLogin();
    

您在/api/** 下的资源将可供“some_oauth_scope”授权的 OAuth 2.0 客户端或具有“ADMIN”角色的“直接”经过身份验证的用户访问。

【讨论】:

以上是关于Oauth 和 Spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章

用于内部 REST 通信的 OAuth + spring 安全性

使用 Spring Boot 的角色层次结构和 OAuth2 安全性

没有 Spring 安全性的 Grails 的 OAuth 2.0

Spring Boot 1.5 禁用 oauth2 安全性

Spring Oauth和安全性在登录成功后重定向到/ login

具有 OAuth 2 和 JWT 安全性的 Spring Boot 微服务