2017-04-19 1 views
0

저는 스프링 보안을 사용하여 응용 프로그램을 작성하고 있습니다. 사용자 정의 UserDetails, UserDetailsService, AccessDecisionVoter 및 WebSecurityConfigurerAdapter를 구현했습니다. 인증되지 않은 사용자가 /authenthication/login 페이지에 액세스하여 로그인하도록 허용하려고하지만, 페이지에 대한 모든 다른 액세스가 사용자 정의 AccessDecisionVoter에 의해 처리되어야합니다.
내 사용자 정의 WebSecurityConfigurerAdapter 클래스는 다음과 같습니다 : 내 데이터베이스에 여러 역할을 정의스프링 보안 : 인증 페이지 permitAll이 무시 된 것 같습니다.

@Configuration 
@EnableWebSecurity 
@ComponentScan(value = "security") 
public class Configuration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsServiceImpl userDetailsServiceImpl; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/authentication/login**") 
       .permitAll() 
       .and() 
      .authorizeRequests() 
       .anyRequest() 
       .authenticated() 
       .accessDecisionManager(accessDecisionManager()) 
     ; 
    } 


    @Bean 
    public AccessDecisionManager accessDecisionManager() { 
     List<AccessDecisionVoter<? extends Object>> decisionVoters = 
       Arrays.asList(new AccessDecisionVoterImpl()); 
     return new UnanimousBased(decisionVoters); 
    } 


    @Override 
    protected void configure(AuthenticationManagerBuilder auth) { 
     try { 
      auth.userDetailsService(userDetailsServiceImpl); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    @Bean 
    public UserDetailsServiceImpl userDetailsService() { 
     return userDetailsServiceImpl; 
    } 

} 

. 내 사용자 지정 AccessDecisionVoter의 vote 메서드는 로그인되어 있고 URL + httpMethod를 기반으로 액세스를 허용하거나 거부하는 사용자의 사용 권한을 검색합니다.

문제 :
나는 사용자 이름과 암호로/인증/로그인에 POST를 보낼 때 내 코드는 나에게 정의의 AccessDecisionVoter에서 NullPointerException이 제공 다음 초래 authentication.getPrincipal(); 반환 anonymousUser 통해 검색 사용자 이름 (, 나중에 코드에서 NullPointer.하지만 구성 파일이 Spring에게 permittAll 액세스/인증/로그인에 대해 알려준 이후로 어쨌든 vote 메서드가 호출되는 이유를 모르겠다.

답변

0

나는 그것을 설정 한 방법으로 permitAll 모든 요청이 허용되도록 (심지어 인증되지 않은 요청도 허용)하지만 해당 요청에 대한 보안 체인을 비활성화하지는 않지만 여전히 요청을 처리하려고합니다 그 (것)들을 전부. 모든 보안을 우회하기를 원한다면 일반적으로 webSecurity 구성 메소드를 무시하고 거기에 예외 사례를 추가하는 방법을 사용합니다.

+0

감사합니다. 이것은 실제로 내 문제를 해결했습니다. 하지만 다른 .. 노출 – Matthias

관련 문제