[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.네, 사전 인증 시나리오는 당신이 찾고있는 것과 정확히 같습니다.
네, 사전 인증 시나리오는 당신이 찾고있는 것과 정확히 같습니다.
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.완전을 기하기 위해 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; } }
위의 코드는 가치가 있다고 생각합니다. 예를 들어 인터넷의 예제는 매우 기본적이고 스프링 문서에는 그러한 세부 사항이 부족하기 때문입니다.
from https://stackoverflow.com/questions/12478589/springsecurity-custom-automatic-authentication by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.1 환경은 사용자 속성 파일과 작동하지 않습니다. (0) | 2019.01.31 |
---|---|
[SPRING] 선두의 낙타 름 단어가 한 글자 밖에없는 경우 왜 Jackson 2는 첫 번째 대문자를 인식하지 못합니까? (0) | 2019.01.31 |
[SPRING] JSP EL 표현식에서 Spring Security Principal 가져 오기 (0) | 2019.01.31 |
[SPRING] 최대 절전 모드 (봄 ORM)와 봄 mvc 3의 적절한 사용 (0) | 2019.01.31 |
[SPRING] Spring + Hibernate를 이용한 멀티 테넌시 : "멀티 테넌 시용으로 구성된 SessionFactory이지만 테넌트 식별자가 지정되지 않았습니다" (0) | 2019.01.31 |