복붙노트

[SPRING] 봄 보안 사용자 정의 필터를 작성하는 방법?

SPRING

봄 보안 사용자 정의 필터를 작성하는 방법?

요청마다 약간의 정보를 받고 싶습니다. 그래서 각 요청에 대한 기능을 가지고 요청에서 정보를 개별적으로 얻는 대신 필터가있는 것이 좋습니다. 그래서 모든 요청은 필터를 통과해야하고 나는 원하는 것을 얻습니다. 질문 : 맞춤 필터를 작성하려면 어떻게해야합니까? 미리 정의 된 스프링 보안 필터와 같지 않으며 완전히 새로운 것입니다.

해결법

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

    1.표준 Java 필터를 사용할 수 있습니다. web.xml의 인증 필터 다음에 배치하십시오 (필터 체인에서 나중에 실행되며 보안 필터 체인 이후에 호출 됨).

    표준 Java 필터를 사용할 수 있습니다. web.xml의 인증 필터 다음에 배치하십시오 (필터 체인에서 나중에 실행되며 보안 필터 체인 이후에 호출 됨).

    public class CustomFilter implements Filter{
    
        @Override
        public void destroy() {
            // Do nothing
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
    
                HttpServletRequest request = (HttpServletRequest) req;
    
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    
                Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
                if (roles.contains("ROLE_USER")) {
                    request.getSession().setAttribute("myVale", "myvalue");
                }
    
                chain.doFilter(req, res);
    
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // Do nothing
        }
    
    }
    

    web.xml의 조각 :

    <!-- The Spring Security Filter Chain -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- Your filter definition -->
    <filter>
        <filter-name>customFilter</filter-name>
        <filter-class>com.yourcompany.test.CustomFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>customFilter</filter-name>
        <url-pattern>/VacationsManager.jsp</url-pattern>
    </filter-mapping>
    

    또한 성공적인 로그인 후에 호출되는 핸들러를 추가 할 수 있습니다 (SavedRequestAwareAuthenticationSuccessHandler를 확장해야 함). 이걸 어떻게하는지보십시오. 그리고 이것이 더 좋은 아이디어라고 생각합니다.

    업데이트 : 또는 다음과 같이 보안 필터의 끝에이 필터를 사용할 수 있습니다.

    <security:filter-chain-map>
        <sec:filter-chain pattern="/**"
                filters="
            ConcurrentSessionFilterAdmin, 
            securityContextPersistenceFilter, 
            logoutFilterAdmin, 
            usernamePasswordAuthenticationFilterAdmin, 
            basicAuthenticationFilterAdmin, 
            requestCacheAwareFilter, 
            securityContextHolderAwareRequestFilter, 
            anonymousAuthenticationFilter, 
            sessionManagementFilterAdmin, 
            exceptionTranslationFilter, 
            filterSecurityInterceptorAdmin,
            MonitoringFilter"/> <!-- Your Filter at the End -->
    </security:filter-chain-map>
    

    필터를 사용하려면 다음을 사용할 수 있습니다.

    public class MonitoringFilter extends GenericFilterBean{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //Implement this Function to have your filter working
    }
    
  2. ==============================

    2.그냥 믹스에 던져; http 요소 내부에서 사용자 정의 필터를 사용하는 방법 :

    그냥 믹스에 던져; http 요소 내부에서 사용자 정의 필터를 사용하는 방법 :

    <security:http auto-config="false" ...>
      ...
      <security:custom-filter position="FORM_LOGIN_FILTER" ref="MyCustomFilter" />
    </security:http>
    
  3. from https://stackoverflow.com/questions/11928637/how-to-write-a-custom-filter-in-spring-security by cc-by-sa and MIT license