programing

Spring Security OAuth2 앱에 사용자 지정 사용자 세부 정보 서비스 추가

stoneblock 2023. 8. 17. 20:34

Spring Security OAuth2 앱에 사용자 지정 사용자 세부 정보 서비스 추가

사용자 정의를 추가하려면 어떻게 합니까?UserDetailsService아래는 이 Spring OAuth2 샘플입니까?

은 " " 입니다.userpassword의 파일에 정의되어 있습니다.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 개발자 가이드는 다음을 사용하라고 말합니다.GlobalAuthenticationManagerConfigurerUserDetailsService이 되는결과보다 .그러나 이러한 이름을 검색하면 도움이 되지 않는 결과를 얻을 수 있습니다.

또한 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에의 에.OAuth2AuthorizationConfigUsers에▁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

제가 언급하고 싶은 다른 것들:

  1. 버전에 따라 다를 수 있습니다. 저는 spring-security-oauth22.0.12에 있습니다.
  2. 저는 왜 이런 식인지 출처를 밝힐 수 없습니다. 제 솔루션이 진짜 솔루션인지 해킹인지조차 잘 모르겠습니다.
  3. 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 requiredtoken을 실행할 때 "" " " " " " 가 있는지 합니다. 그리고 당신은 이미 가지고 있다고 확인했습니다.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