[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.마침내 나는 내 문제를 해결할 수 있었다. 필터를 사용하는 대신 성공적인 로그인을 위해 호출하는 핸들러를 추가했습니다.
마침내 나는 내 문제를 해결할 수 있었다. 필터를 사용하는 대신 성공적인 로그인을 위해 호출하는 핸들러를 추가했습니다.
다음 줄이 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.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>
from https://stackoverflow.com/questions/11337997/how-to-add-custom-filter-after-user-authorize-in-spring-application by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 명령 객체 (0) | 2019.03.30 |
---|---|
[SPRING] URI 구문 분석을위한 Spring 유틸리티 (0) | 2019.03.30 |
[SPRING] 동적 속성이있는 @TestPropertySource (0) | 2019.03.30 |
[SPRING] 봄 콩을 스포크 테스트에 주입하는 법 (0) | 2019.03.30 |
[SPRING] 스프링의 @RequestParam 주석 내부 작업 (0) | 2019.03.30 |