Spring Security OAuth2 앱에 사용자 지정 사용자 세부 정보 서비스 추가
사용자 정의를 추가하려면 어떻게 합니까?UserDetailsService
아래는 이 Spring OAuth2 샘플입니까?
은 " " 입니다.user
password
의 파일에 정의되어 있습니다.authserver
앱
저는 과 같은 사용자 정의를 하고 싶습니다.UserDetailsService
테스트 목적으로 앱의 패키지로:
package demo;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.stereotype.Service;
@Service
class Users implements UserDetailsManager {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String password;
List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER");
if (username.equals("Samwise")) {
auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT");
password = "TheShire";
}
else if (username.equals("Frodo")){
auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT");
password = "MyRing";
}
else{throw new UsernameNotFoundException("Username was not found. ");}
return new org.springframework.security.core.userdetails.User(username, password, auth);
}
@Override
public void createUser(UserDetails user) {// TODO Auto-generated method stub
}
@Override
public void updateUser(UserDetails user) {// TODO Auto-generated method stub
}
@Override
public void deleteUser(String username) {// TODO Auto-generated method stub
}
@Override
public void changePassword(String oldPassword, String newPassword) {
// TODO Auto-generated method stub
}
@Override
public boolean userExists(String username) {
// TODO Auto-generated method stub
return false;
}
}
처럼 이 피시이, 은것다보입니다.UserDetailsService
아닙니다autowired
그러나 테스트 목적으로만 설계되었기 때문에 안전하지 않은 암호를 사용합니다.
사용자가 로그인할 수 있도록 GitHub 샘플 앱에 대해 어떤 구체적인 변경이 필요합니까? 변경이 필요합니까? 아니면 다른 곳에서 변경해야 합니까?
제안 사항:
Spring OAuth2 개발자 가이드는 다음을 사용하라고 말합니다.GlobalAuthenticationManagerConfigurer
를 UserDetailsService
그 이 되는결과보다 .그러나 이러한 이름을 검색하면 도움이 되지 않는 결과를 얻을 수 있습니다.
또한 Outh 대신 내부 스프링 보안을 사용하는 다른 앱은 다음 구문을 사용하여 연결합니다.UserDetailsService
하지만 구문을 현재 OP로 조정하는 방법을 잘 모르겠습니다.
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
@Autowired
private Users users;
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(users);
}
}
사용해 보았습니다.@Autowire
에의 에.OAuth2AuthorizationConfig
Users
에▁AuthorizationServerEndpointsConfigurer
같이 표시됩니다.
@Autowired//THIS IS A TEST
private Users users;//THIS IS A TEST
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.accessTokenConverter(jwtAccessTokenConverter())
.userDetailsService(users)//DetailsService)//THIS LINE IS A TEST
;
}
가 Spring Boot으로 됩니다.Samwise
. 즉 발되지않았다즉니습견,즉▁the.UserDetailsService
연결되지 않았습니다.Boot 로그에서 입니다: "Spring Boot"입니다.
2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9] o.s.s.a.dao.DaoAuthenticationProvider :
User 'Samwise' not found
2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9]
w.a.UsernamePasswordAuthenticationFilter :
Authentication request failed:
org.springframework.security.authentication.BadCredentialsException:
Bad credentials
또 뭐 해볼 수 있어요?
스프링 시큐리티로 myoauth 서버를 개발할 때도 비슷한 문제가 발생했습니다.제 상황은 조금 달랐습니다, 제가 추가하고 싶었기 때문입니다.UserDetailsService
새로 고침 토큰을 인증하는 것입니다. 하지만 제 솔루션이 당신에게도 도움이 될 것 같습니다.
당신처럼, 저도 처음에 다음을 지정하려고 했습니다.UserDetailsService
사용AuthorizationServerEndpointsConfigurer
하지만 이것은 효과가 없습니다. 이이버그의잘는모만지겠르지지도것인인적,▁i만지▁but겠모▁the르,▁or잘▁is▁bug▁this.UserDetailsService
는 서설정야합니에 .AuthenticationManager
다양한 oauth2 클래스가 이 클래스를 찾을 수 있습니다.이것은 저에게 효과가 있었습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
Users userDetailsService;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// other stuff to configure your security
}
}
73번 줄부터 다음 사항을 변경하면 효과가 있을 것으로 생각합니다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.parentAuthenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
}
물론추야할있다습니가필요해가다를 추가해야 할 것입니다.@Autowired Users userDetailsService;
에의 에.WebSecurityConfigurerAdapter
제가 언급하고 싶은 다른 것들:
- 버전에 따라 다를 수 있습니다. 저는 spring-security-oauth22.0.12에 있습니다.
- 저는 왜 이런 식인지 출처를 밝힐 수 없습니다. 제 솔루션이 진짜 솔루션인지 해킹인지조차 잘 모르겠습니다.
- 그
GlobalAuthenticationManagerConfigurer
가이드에 언급된 것은 거의 확실히 오타입니다. 봄에는 소스 코드 어디에서도 해당 문자열을 찾을 수 없습니다.
제 요구 사항은 oauth2 이메일 속성 뒤에서 데이터베이스 개체를 가져오는 것이었습니다.사용자 지정 세부 정보 서비스를 만들어야 한다고 생각하여 이 질문을 발견했습니다.사실 저는 OidcUser 인터페이스를 구현하고 그 프로세스에 연결해야 합니다.
처음에는 OAuth2UserService인 줄 알았는데, AWS Cognito 인증 공급자를 설정하여 open id connect.
//inside WebSecurityConfigurerAdapter
http
.oauth2Login()
.userInfoEndpoint()
.oidcUserService(new CustomOidcUserServiceImpl());
...
public class CustomOidcUserServiceImpl implements OAuth2UserService<OidcUserRequest, OidcUser> {
private OidcUserService oidcUserService = new OidcUserService();
@Override
public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
OidcUser oidcUser = oidcUserService.loadUser(userRequest);
return new CustomUserPrincipal(oidcUser);
}
}
...
public class CustomUserPrincipal implements OidcUser {
private OidcUser oidcUser;
//forward all calls onto the included oidcUser
}
맞춤형 서비스는 맞춤형 로직을 사용할 수 있는 곳입니다.는 구할계다니를 입니다.UserDetails
내인이스의 CustomUserPrincipal
라이브 및 테스트를 위한 다양한 인증 메커니즘을 사용하여 자동 UI 테스트를 용이하게 할 수 있습니다.
저는 같은 문제에 부딪혔고 원래 Manan Mehta가 게시한 것과 같은 해결책을 가지고 있었습니다.와 spring 을 새로 하여 " oauth2"라는 HTTP 500 오류가 했습니다.UserDetailsService is required
내 일지에.
관련 스택 추적은 다음과 같습니다.
java.lang.IllegalStateException: UserDetailsService is required.
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:463)
at org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper.loadUserDetails(UserDetailsByNameServiceWrapper.java:68)
at org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider.authenticate(PreAuthenticatedAuthenticationProvider.java:103)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174)
at org.springframework.security.oauth2.provider.token.DefaultTokenServices.refreshAccessToken(DefaultTokenServices.java:150)
하단에서 볼 수 있습니다.DefaultTokenServices
토큰을 새로 고치려고 합니다.그리고 나서 그것은 다음을 불러옵니다.AuthenticationManager
(사용자가 권한을 취소하거나 사용자가 삭제된 경우 등) 다시 인증하지만 여기서 모든 것이 해결됩니다.맨에 "" "" " ""가 표시됩니다.UserDetailsServiceDelegator
에 전화를 거는 이유는 무엇입니까?loadUserByUsername
나의 의나아운대신에다름 에.UserDetailsService
비록 내 안에WebSecurityConfigurerAdapter
설정합니다.UserDetailsService
의 다른 다른두개있다니습가▁other▁two가 있습니다.WebSecurityConfigurerAdapter
하나는 더를 위한 것입니다.ResourceServerConfiguration
그리고 하나는 더를 위한 것입니다.AuthorizationServerSecurityConfiguration
은 그고그구은결그얻못지합다니것을코성들러리한▁the▁get다못▁and니를 얻지 못합니다.UserDetailsService
내가 설정한 것.
무슨 일이 일어나고 있는지 정리하기 위해 Spring Security를 통해 추적하는 동안, 저는 "로컬"이 있다는 것을 발견했습니다.AuthenticationManagerBuilder
"그고글 "로벌리"."입니다.AuthenticationManagerBuilder
그리고 이 정보가 다른 건설업자 컨텍스트에 전달되도록 하려면 글로벌 버전에 설정해야 합니다.
그래서, 제가 생각해낸 해결책은 다른 문맥들이 글로벌 버전을 얻는 것과 같은 방식으로 "글로벌" 버전을 얻는 것이었습니다. 내에 안에.WebSecurityConfigurerAdapter
다음을 경험했습니다.
@Autowired
public void setApplicationContext(ApplicationContext context) {
super.setApplicationContext(context);
AuthenticationManagerBuilder globalAuthBuilder = context
.getBean(AuthenticationManagerBuilder.class);
try {
globalAuthBuilder.userDetailsService(userDetailsService);
} catch (Exception e) {
e.printStackTrace();
}
}
그리고 이것은 효과가 있었습니다. 내 다른맥이제나의은이 있었습니다.UserDetailsService
미래에 이 지뢰밭을 발견한 용감한 군인들을 위해 이 자리를 남겨두겠습니다.
누구나 가질 수 있는UserDetailsService is required
token을 실행할 때 "" " " " " " 가 있는지 합니다. 그리고 당신은 이미 가지고 있다고 확인했습니다.UserDetailsService
추가해 보십시오.
@Configuration
public class GlobalSecurityConfig extends GlobalAuthenticationConfigurerAdapter {
private UserDetailsService userDetailsService;
public GlobalSecurityConfig(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
}
이것은 저의 시도이자 실수입니다. 아마도 당신에게 도움이 되지 않을 것입니다.
딸 "하면, "게스"를 확장할 수 있습니다.AuthorizationServerConfigurerAdapter
그리고.WebSecurityConfigurerAdapter
그리고 혼자서 모든 것을 구성하지만, 스프링 자동 구성의 힘이 떨어진 것 같습니다.일부 구성만 사용자 지정하면 되는 경우 모든 구성이 필요한 이유는 무엇입니까?
언급URL : https://stackoverflow.com/questions/36730903/add-custom-userdetailsservice-to-spring-security-oauth2-app
'programing' 카테고리의 다른 글
마리아에서 60GB 이상의 테이블에서 기본 SQL 쿼리도 실행DB (0) | 2023.08.17 |
---|---|
텍스트가 많은 MySQL 테이블 (0) | 2023.08.17 |
Nodejs AWS SDK S3 사전 서명된 URL 생성 (0) | 2023.08.17 |
Oracle에 연결할 로깅 핸들러를 생성하시겠습니까? (0) | 2023.08.17 |
Google Play Services Library 업데이트 및 누락 기호 @integer/google_play_services_version (0) | 2023.08.17 |