Spring security oauth2.0 restful 和 Form 登录配置

Posted

技术标签:

【中文标题】Spring security oauth2.0 restful 和 Form 登录配置【英文标题】:Spring security oauth2.0 restful and Form login config 【发布时间】:2017-01-03 07:43:34 【问题描述】:

我有一个可以使用 from 或通过 oauth2 登录的应用程序。 但是我遇到了一些麻烦。

我遇到了什么:

当我访问 http://127.0.0.1/ 时,它会转到 /login 页面。 当我访问http://127.0.0.1/api/hellos 时,它也会转到/login 页面,这是什么问题。我想要的是我可以使用 oauth2 访问 /api/hellos。

这是我的安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Autowired
    private SpringDataMyBatisUserDetailsService userDetailsService;

    @Override
    @Autowired
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth
        .userDetailsService(this.userDetailsService)
        .passwordEncoder(Manager.PASSWORD_ENCODER);
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class);
    

    @Configuration
    @EnableAuthorizationServer
    public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter 

        private final AuthenticationManager authenticationManager;
        @Autowired
        private TokenStore tokenStore;
        @Autowired
        private SpringDataMyBatisClientDetailsService clientDetailsService;

        @Autowired
        public AuthorizationServerConfig(AuthenticationManager authenticationManager) 
            this.authenticationManager = authenticationManager;
        

        /**
         * Defines the security constraints on the token endpoints /oauth/token_key and /oauth/check_token
         * Client credentials are required to access the endpoints
         *
         * @param oauthServer
         * @throws Exception
         */
        @Override
        public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
            oauthServer
            .tokenKeyAccess("permitAll()")
            .checkTokenAccess("isAuthenticated()");
        

        /**
         * Defines the authorization and token endpoints and the token services
         *
         * @param endpoints
         * @throws Exception
         */
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
            endpoints
            .authenticationManager(this.authenticationManager)
            .tokenEnhancer(tokenEnhancer())
            .tokenStore(tokenStore);
        

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
            clients
            .withClientDetails(clientDetailsService);
        

        @Bean
        public TokenEnhancer tokenEnhancer() 
            return new CustomTokenEnhancer();
        

    

    @Order(1)
    @Configuration
    public class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter 

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/index.html", "/index.css", "/common.js", "/index.js", "/api/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout()
            .logoutSuccessUrl("/")
            .and().exceptionHandling().accessDeniedPage("/error/403");
        

    

    @Configuration
    @EnableResourceServer
    @Order(2)
    public class AuthorizationResourceConfig extends ResourceServerConfigurerAdapter 

        @Autowired
        private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
        @Autowired
        private AuthenticationSuccessHandler successHandler;
        @Autowired
        private AuthenticationFailureHandler failureHandler;
        @Autowired
        private TokenStore tokenStore;

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) throws Exception 
            resources
            .stateless(true)
            .tokenStore(tokenStore);
        

        @Override
        public void configure(HttpSecurity http) throws Exception 
            http
            .authorizeRequests()
            .and()
            .anonymous().disable()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().httpBasic()
            .and()
            .exceptionHandling()
            .accessDeniedHandler(new OAuth2AccessDeniedHandler())
            .authenticationEntryPoint(restAuthenticationEntryPoint)
            .and()
            .authorizeRequests()
            .antMatchers("/api/**").fullyAuthenticated();

        
    


我尝试了一些从谷歌搜索的方法。但没有一个可以帮助我。 所以,我真的很想有人能帮助我,我会为你感激的。

此外,我搜索到的最有用的信息是this。

【问题讨论】:

【参考方案1】:

你使用这个 ".antMatchers("/api/**").fullyAuthenticated(); ",在这种情况下,所有操作 /api/.... 都需要一个 "LOG IN",如果你不希望“127.0.0.1/api/hellos”的“登录”表单你必须只使用 /api/ 不带星号

【讨论】:

我没有使用 RESOURCE_PATH_MATCH 。我已将其删除。 你使用这个 ".antMatchers("/api/**").fullyAuthenticated(); ",在这种情况下,所有操作 /api/... . ,,如果你不想要“127.0.0.1/api/hellos”的“登录”表单,你必须只使用 /api/ 不带星号 你可能误会了。我的项目包含两个不同的部分,一个 JSF 管理面板和一个 RESTfull 服务。我正在尝试设置 spring 安全性以根据用户导航的 URL 使用不同的身份验证方法。

以上是关于Spring security oauth2.0 restful 和 Form 登录配置的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2.0学习(4-99)Spring Security OAuth2.0 开发指南

spring security oauth2.0 实现

使用 oAuth2.0 和表单登录的 Spring Security

妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!

Spring Security实现OAuth2.0授权服务 - 进阶版

spring security oauth2.0 实现