복붙노트

[SPRING] 봄 애플리케이션에서 사용자 권한 부여 후 사용자 정의 필터를 추가하는 방법

SPRING

봄 애플리케이션에서 사용자 권한 부여 후 사용자 정의 필터를 추가하는 방법

저는 Spring Security 3의 초보자입니다. 사용자 로그인을 위해 역할을 사용하고 있습니다.

사용자가 애플리케이션에 권한을 부여한 후 세션 값을 추가하고 싶습니다. 어쩌면 일부 세션 값을 추가하는 내 메서드로 리디렉션되도록 일부 필터가 필요합니다. security.xml 파일을 구성했지만 올바르게 작동하는지 확신 할 수 없습니다. 그 방향의 어떤 예도 도움이 될 것입니다. 어떤 필터 클래스를 사용해야합니까? security.xml 파일을 어떻게 구성해야합니까?

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>

<beans:bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="authenticationSuccessHandler" ref="successHandler" />
</beans:bean> 

<beans:bean id="successHandler" class="org.dfci.sparks.datarequest.security.CustomAuthorizationFilter"/>

내 필터 클래스 메서드 일부 세션 값을 추가해야합니다.

public class CustomAuthorizationFilter implements AuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication
                .getAuthorities());
        if (roles.contains("ROLE_USER")) {
            request.getSession().setAttribute("myVale", "myvalue");
        }
    }
}

코드 편집

security.xml 파일과 클래스 파일을 수정했습니다.

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/>  
public class CustomAuthorizationFilter extends GenericFilterBean {

    /*
     * ServletRequestAttributes attr = (ServletRequestAttributes)
     * RequestContextHolder.currentRequestAttributes(); HttpSession
     * session=attr.getRequest().getSession(true);
     */
    @Autowired
    private UserService userService;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        try {
            chain.doFilter(request, response);

                    HttpServletRequest req = (HttpServletRequest) request;
                    HttpSession session = req.getSession(true);
                    Authentication authentication = SecurityContextHolder
                            .getContext().getAuthentication();
                    Set<String> roles = AuthorityUtils
                            .authorityListToSet(authentication.getAuthorities());
                    User user = null;                   
                        if (true) {
                            session.setAttribute("Flag", "Y");
                        } 
            }

        } catch (IOException ex) {
            throw ex;
        }
    }

}

각 URL을 호출합니다. 사용자가 인증 될 때 필터 메소드를 한 번만 호출하는 대안이 있습니까?

해결법

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

    1.마침내 나는 내 문제를 해결할 수 있었다. 필터를 사용하는 대신 성공적인 로그인을 위해 호출하는 핸들러를 추가했습니다.

    마침내 나는 내 문제를 해결할 수 있었다. 필터를 사용하는 대신 성공적인 로그인을 위해 호출하는 핸들러를 추가했습니다.

    다음 줄이 security.xml에 추가되었습니다.

    <form-login login-page="/" authentication-failure-url="/?login_error=1" default-target-url="/" always-use-default-target="false"  
            authentication-success-handler-ref="authenticationSuccessHandler"/>
            <logout />
    
    <beans:bean id="authenticationSuccessHandler" class="security.CustomSuccessHandler"/>
    

    또한 세션 특성을 추가하는 하나의 사용자 지정 처리기를 추가했습니다.

    package security;
    
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
    
    public class CustomSuccessHandler extends
                SavedRequestAwareAuthenticationSuccessHandler {
        @Override
        public void onAuthenticationSuccess(final HttpServletRequest request,
                final HttpServletResponse response, final Authentication authentication)
                throws IOException, ServletException {
            super.onAuthenticationSuccess(request, response, authentication);
    
            HttpSession session = request.getSession(true);
    
            try {
                if (CurrentUser.isUserInRole("USER")) {
                    session.setAttribute("Flag", "user");
                } 
            } catch (Exception e) {
                logger.error("Error in getting User()", e);
            } 
        }
    
    }
    
  2. ==============================

    2.standart Java 필터를 사용할 수 있습니다 (필터 인터페이스 구현). web.xml의 인증 필터 다음에 배치하십시오. 이는 필터 체인에서 나중에 나올 것이고 보안 필터 체인 다음에 호출된다는 것을 의미합니다.

    standart 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>
    
    <!-- Pay attention to the url-pattern -->
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <!-- <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher> -->
    </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>
    
  3. from https://stackoverflow.com/questions/11337997/how-to-add-custom-filter-after-user-authorize-in-spring-application by cc-by-sa and MIT license