Добавление пользовательского UserDetailsService в приложение Spring Security OAuth2
Как добавить кастомUserDetailsService
ниже доэтот весенний образец OAuth2?
По умолчаниюuser
по умолчаниюpassword
определяется вapplication.properties
файлauthserver
приложение.
Тем не менее, я хотел бы добавить следующий кастомUserDetailsService
вdemo
пакет изauthserver
приложение для тестирования:
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 так что пользователь может войти какusername=Samwise
сpassword=TheShire
или какusername=Frodo
сpassword=MyRing
? Нужно ли вносить изменения вAuthserverApplication.java
или в другом месте?
SUGGESTIONS:
Spring OAuth2 Руководство разработчика говорит использоватьGlobalAuthenticationManagerConfigurer
настроитьUserDetailsService
во всем мире. Однако поиск в этих именах дает менее чем полезные результаты.
Кроме того, другое приложение, которое использует внутреннюю пружинную защиту INSTEAD OF OAuth, использует следующий синтаксис для подключения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
не был найден, что означает, чтоUserDetailsService
не был успешно подключен. Вот соответствующая выдержка из журналов 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
Что еще я могу попробовать?