복붙노트

[SPRING] 스프링 보안 - 사용자 정의 자동 인증

SPRING

스프링 보안 - 사용자 정의 자동 인증

이것은 나의 시나리오이다 :

그래서, 나는 사용자 정의 필터를 개발할 필요가있다. - 나는 추측한다. - 요청으로부터 사용자 정보를 검색하고, 데이터베이스에서 검색하고, 사용자 지정 DetailsUserService를 통해 사용자 (전자 메일 등)에 대한 추가 정보를 가져온 다음에 인증을 수행 할 수있다. 해당 요청에서 검색된 역할에 따라 해당 사용자.

사전 인증 필터를보고 있었지만 올바른 선택인지는 확실하지 않습니다. 그 개체는 교장이 이미 세션에있을 때 이전에 인증 된 machanism에 의해 사용될 것으로 예상됩니다 (맞습니까?).

나는 일단 올바른 필터를 찾으면 다음과 같이 수행해야한다고 생각합니다.

GrantedAuthority[] ga= new GrantedAuthority[1];
ga[0] = new GrantedAuthorityImpl(myUser.getRole());

SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = new UsernamePasswordAuthenticationToken(userName, userPwd, ga);
a = authenticationManager.authenticate(a);
sc.setAuthentication(a);

내 문제를 해결하는 것이 올바른 방향인가? 누락 된 부분을 찾을 수 있도록 도움을 줄 수있는 제안이 있으십니까?

다들 감사 해요,

루카

부가:

해결법

  1. ==============================

    1.네, 사전 인증 시나리오는 당신이 찾고있는 것과 정확히 같습니다.

    네, 사전 인증 시나리오는 당신이 찾고있는 것과 정확히 같습니다.

    Pre-Authentication을 사용하여 요청으로부터 PreAuthenticatedAuthenticationToken을 원하는대로 생성 할 수 있습니다. 다른 질문에서 설명한 몇 가지 사항 만 수행하면됩니다.

    먼저 AbstractPreAuthenticatedProcessingFilter를 확장하여 요청에서 사용자 이름과 역할을 얻습니다.

    public class MyPreAuthenticatedProcessingFilter
        extends AbstractPreAuthenticatedProcessingFilter {
    
      public MyPreAuthenticatedProcessingFilter(
          AuthenticationManager authenticationManager) {
        setAuthenticationDetailsSource(new MyAuthenticationDetailsSource());
      }
    
      @Override
      protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
        return "Anonymous";
      }
    
      @Override
      protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
        return "N/A";
      }
    
      public static class MyAuthenticationDetailsSource implements 
          AuthenticationDetailsSource<HttpServletRequest, MySessionUserDetails> {
        // roles probably should be encrypted somehow
        static final String ROLES_PARAMETER = "pre_auth_roles";
    
        @Override
        public MySessionUserDetails buildDetails(HttpServletRequest req) {
          // create container for pre-auth data
          return new MySessionUserDetails(req.getParameter(ROLES_PARAMETER));
        }
      }
    }
    

    MySessionUserDetails 클래스는 역할이있는 Spring을 SimpleGrantedAuthority의 List 또는 다른 GrantedAuthority 구현으로 분할합니다. 또한, List는 GrantedAuthority []보다 우월하고 더 좋습니다.

    둘째, AuthenticationUserDetailsService 구현 :

    public class MyPreAuthenticatedUserDetailsService implements 
        AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> {
    
      @Override
      public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken token)
          throws UsernameNotFoundException {
        MySessionUserDetails sessionUserDetails =
            (MySessionUserDetails) token.getDetails();
        List<GrantedAuthority> authorities = sessionUserDetails.getAuthorities();
        return new User(token.getName(), "N/A", true, true, true, true, authorities);
      }
    }
    

    그런 다음 XML 연결 블록에서 다음을 수행하십시오.

    <security:http use-expressions="true">
      <security:intercept-url pattern="/**" access="isAuthenticated()" />
      <security:custom-filter position="PRE_AUTH_FILTER"
          ref="myPreAuthenticationFilter" />
    </security:http>
    
    <bean id="myPreAuthenticationFilter"
        class="com.example.MyPreAuthenticatedProcessingFilter">
      <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
      <property name="preAuthenticatedUserDetailsService">
        <bean class="com.example.MyPreAuthenticatedUserDetailsService" />
      </property>
    </bean>
    
    <security:authentication-manager alias="authenticationManager">
      <security:authentication-provider ref="preauthAuthProvider" />
    </security:authentication-manager>
    

    그리고 짜잔! 응용 프로그램에 사용할 인증 된 사용자 보안 주체가 있어야합니다.

    여기에 작성된 코드에는 Spring Security 3.1이 필요합니다. 사용하고자한다면 강력히 권장합니다 (스프링 3.0.7 이상 필요). 또한 Spring Security 레퍼런스 매뉴얼은 여러분의 친구입니다!

  2. ==============================

    2.완전을 기하기 위해 Spring Security 4에서는 약간 변경되었습니다. 예를 들어 Java 구성을 적극 권장합니다. 이런 식으로 Spring Boot와 통합하는 것이 더 쉽습니다.

    완전을 기하기 위해 Spring Security 4에서는 약간 변경되었습니다. 예를 들어 Java 구성을 적극 권장합니다. 이런 식으로 Spring Boot와 통합하는 것이 더 쉽습니다.

    위의 응답에 제공된 XML 구성과 동일한 Java 구성을 따릅니다.

    @Configuration
    @EnableWebSecurity
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.addFilterBefore(customAuthFilter(), AbstractPreAuthenticatedProcessingFilter.class)
                .authenticationProvider(preauthAuthProvider())
                .authorizeRequests()
                .anyRequest().authenticated();
        }
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(preauthAuthProvider());
        }
    
        @Bean
        public PreAuthenticatedAuthenticationProvider preauthAuthProvider() {
            PreAuthenticatedAuthenticationProvider preauthAuthProvider =
                new PreAuthenticatedAuthenticationProvider();
                    preauthAuthProvider.setPreAuthenticatedUserDetailsService(
                        userDetailsServiceWrapper());
            return preauthAuthProvider;
        }
    
        @Bean
        public OnlyRolesPreAuthenticatedUserDetailsService userDetailsServiceWrapper() {
            OnlyRolesPreAuthenticatedUserDetailsService service =
                new MyPreAuthenticatedUserDetailsService();
            return service;
        }
    
        @Bean
        public MyPreAuthenticatedProcessingFilter customAuthFilter() throws Exception {
            MyPreAuthenticatedProcessingFilter filter = new MyPreAuthenticatedProcessingFilter();
            filter.setAuthenticationManager(authenticationManager());
            return filter;
        }
    }
    

    위의 코드는 가치가 있다고 생각합니다. 예를 들어 인터넷의 예제는 매우 기본적이고 스프링 문서에는 그러한 세부 사항이 부족하기 때문입니다.

  3. from https://stackoverflow.com/questions/12478589/springsecurity-custom-automatic-authentication by cc-by-sa and MIT license