[SPRING] Spring Security의 프로그램 적 사용
SPRINGSpring Security의 프로그램 적 사용
저는 Wicket Auth Project와 함께 Wakeet을 사용하여 프리젠 테이션 레이어를 만들고 있습니다. 따라서 Spring Security와 통합했습니다. 이것은 나를 위해 Wicket에 의해 호출되는 메소드입니다 :
@Override
public boolean authenticate(String username, String password) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
} catch (AuthenticationException e) {
return false;
}
return true;
}
스프링 보안 XML 설정의 내용 (내부)은 다음과 같다.
<http path-type="regex">
<form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
<password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>
2.3.6 절. 참조 문서의 세션 고정 공격 보호는 다음과 같이 말합니다.
인증은 작동하지만, 나는 스프링 보안에 대해 상당히 새롭기 때문에 나는 또한 대답이 필요한 몇 가지 질문을 가지고있다 :
최신 정보: 세션 고정 공격 보호를 위해 서명 startNewSessionIfRequired (HttpServletRequest 요청, 부울 migrateAttributes, SessionRegistry sessionRegistry)를 사용하여 SessionUtils 클래스의 메소드를 호출해야합니다.
전달해야하는 SessionRegistry 인스턴스를 얻으려면 어떻게해야합니까? 별칭 ID를 만들거나 ID 또는 이름을 가져 오는 방법을 찾을 수 없습니다.
해결법
-
==============================
1.어쩌면 그것은 당신의 질문에 대한 완전한 답이 아니지만 아마도 당신을 도울 것입니다.
어쩌면 그것은 당신의 질문에 대한 완전한 답이 아니지만 아마도 당신을 도울 것입니다.
프로그래밍 방식의 로그인을 사용하지 않을 때 호출되는 코드이지만 여기서는 표준 방식을 사용합니다.
org.springframework.security.ui.webapp.AuthenticationProcessingFilter
나는 당신이 당신의 코드에 영감을받은 것 같아요. 그것은 꽤 비슷해 보입니다.
마찬가지로 표준 접근 방식에서 / j_spring_security_logout에 액세스 할 때 실행되는 코드는 다음에서 찾을 수 있습니다.
org.springframework.security.ui.logout.LogoutFilter
LogoutFilter는 여러 핸들러를 호출합니다. 우리가 사용하고있는 핸들러는 다음과 같이 호출된다 : org.springframework.security.ui.logout.SecurityContextLogoutHandler, 그래서 당신은 당신의 접근법에서 같은 코드를 호출 할 수 있습니다.
-
==============================
2.당신은 참으로 세션 고정 공격에 개방적 일 것입니다. 이 문제를 해결하기 위해 Spring 코드에 의해 다시 "영감을받을"수 있습니다. 새 세션을 만들려면 httpsession에 대한 액세스 권한이 있어야하므로 리팩토링을해야 할 수도 있습니다.
당신은 참으로 세션 고정 공격에 개방적 일 것입니다. 이 문제를 해결하기 위해 Spring 코드에 의해 다시 "영감을받을"수 있습니다. 새 세션을 만들려면 httpsession에 대한 액세스 권한이 있어야하므로 리팩토링을해야 할 수도 있습니다.
SessionUtils.startNewSessionIfRequired 메소드를 볼 경우.
그러면 인증이 새 세션으로 마이그레이션됩니다. 이 메소드를 직접 호출하거나 코드를 약간 리팩토링 할 수 있습니다.
프로그래밍 방식의 로그 아웃의 경우 사용자를 로그 아웃해야 할 때 session.invalidate ()를 호출하는 것만으로는 너무 멀리 갈 수 없습니다. 이렇게하면 일반적인 보안 관점에서 필요한 모든 작업을 수행 할 수 있지만 세션에서 정리해야 할 수도 있지만 염두에 두어야합니다. 매우 복잡한 필터 집합이 있고 나머지 요청에 대해 사용자가 로그 아웃하도록하려면 다음을 추가 할 수 있습니다.
SecurityContextHolder.getContext().setAuthentication(null);
URL의 가로 채기에 관해서는 당신은 다만 그들을 사용되지 않는 무언가에 놓을 수 있고 그것을 무시할 수 있었다! 구성에서 가로 채기를 해제 할 수 있는지 확실하지 않습니다. 정말로 제거한 다음 AuthenticationProcessingFilter를 살펴보고 싶다면 이것을 사용자 정의 할 수 있습니다. 이렇게하면 스프링 보안 xml을 수동으로 설정하고 제공된 네임 스페이스를 사용하지 않아야합니다. 그다지 어렵지는 않습니다. 오래된 문서를 보면 어떻게하는지보실 수 있습니다.
희망이 도움이!
-
==============================
3.1) 프로그래밍 방식의 로그 아웃
1) 프로그래밍 방식의 로그 아웃
2) Spring Security에 특정 URL을 가로 채지 마라.이 종류는 응용 프로그램의 URL 공간이 어떻게 설정되어 있는지에 달려있다. 모든 페이지 (/ logIn 및 / logout 제외)가 context / myApp에 살았다면 다음과 같이 할 수 있습니다 :
<http ....> <intercept-url pattern="/myApp/**" ..> .... </http>
-
==============================
4.프로그래밍 방식의 로그인에 문제가 있습니다. 모든 authenticationManager.authenticate (...) 및 SecurityContextHolder.getContext (). setAuthentication (...) 메서드를 호출했지만 Session에 몇 가지 문제가있었습니다. 세션을 제대로 관리하려면 다음 줄을 추가해야했습니다.
프로그래밍 방식의 로그인에 문제가 있습니다. 모든 authenticationManager.authenticate (...) 및 SecurityContextHolder.getContext (). setAuthentication (...) 메서드를 호출했지만 Session에 몇 가지 문제가있었습니다. 세션을 제대로 관리하려면 다음 줄을 추가해야했습니다.
HttpSession session = request.getSession(); session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());
위에 게시 된 예제 코드는 분명하지 않았습니다. http://forum.springsource.org/showthread.php?t=69761에서 자세한 내용을 확인하십시오.
-
==============================
5.프로그래밍 방식의 로그 아웃을 수행하려면 org.springframework.security.core.AuthenticationException을 던질 수도 있습니다. 예 : SessionAuthenticationException. 이 경우 ExceptionTranslationFilter가 로그 아웃을 시작합니다.
프로그래밍 방식의 로그 아웃을 수행하려면 org.springframework.security.core.AuthenticationException을 던질 수도 있습니다. 예 : SessionAuthenticationException. 이 경우 ExceptionTranslationFilter가 로그 아웃을 시작합니다.
-
==============================
6.이것을 시도 할 수 있습니다.
이것을 시도 할 수 있습니다.
try { HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } SecurityContextHolder.clearContext(); } catch (Exception e) { logger.log(LogLevel.INFO, "Problem logging out."); }
from https://stackoverflow.com/questions/1013032/programmatic-use-of-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 통합 테스트에서 MockMvc와 RestTemplate의 차이점 (0) | 2019.03.02 |
---|---|
[SPRING] IntelliJ IDEA는 Spring의 @Autowired 주석을 사용할 때 오류를 표시합니다. (0) | 2019.03.02 |
[SPRING] Spring MVC 애플리케이션의 서비스 레이어에 어떤 명명 규칙을 사용합니까? [닫은] (0) | 2019.03.02 |
[SPRING] Java Spring 애플리케이션 프로파일 링 (0) | 2019.03.02 |
[SPRING] 스프링 보안 로그 아웃이 작동하지 않음 - 보안 컨텍스트를 지우지 않고 인증 된 사용자가 여전히 존재 함 (0) | 2019.03.02 |