J'essaie de faire le tour de OAuth2 et de Spring Security OAuth, en particulier le service OAuth Provider. J'essaie d'implémenter les éléments suivants:
Tous ces modules sont indépendants les uns des autres, c'est-à-dire séparés dans différents projets et seront hébergés sur différents domaines, tels que (1) http://oauth.web.com , (2) http://rest.web.com , (3) http://web.com
Mes deux questions sont:
A. Comment puis-je implémenter un projet de client Web afin que lorsque l'utilisateur se connecte sur la page protégée ou clique sur le bouton Connexion, être redirigé vers l'URL du fournisseur OAuth, se connecter et être authentifié sur le client Web avec tous les rôles d'utilisateur et également besoin également de savoir quel client a été utilisé. @EnableResourceServer
(de la même manière que Resource Server est implémenté; voir le code ci-dessous) dans ce projet pour obtenir les détails de l'utilisateur? Dois-je gérer le jeton d'accès et l'inclure toujours dans l'appel au serveur de ressources ou cela peut se faire automatiquement d'une manière ou d'une autre?
B. Quelle est la meilleure façon de mettre en œuvre la sécurité sur les applications mobiles que je développerai. Dois-je utiliser le mot de passe grand pour cette authentification, car les applications seront créées par moi-même où j'aurai un nom d'utilisateur et un mot de passe sur l'écran natif, puis envoyées au serveur en tant qu'authentification de base sur SSL? Y a-t-il des exemples que je peux jeter un oeil à cette conversation avec Spring Security OAuth et retourner les détails de l'utilisateur.
Voici ma mise en œuvre du projet OAuth (1) et du projet de ressources (2):
Configurations du serveur OAuth2 (la plupart du code provient de ICI )
@Configuration
@EnableAuthorizationServer
public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
DataSource dataSource;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore())
.approvalStore(approvalStore())
.authorizationCodeServices(authorizationCodeServices())
;
}
@Bean
public JdbcClientDetailsService clientDetailsService() {
return new JdbcClientDetailsService(dataSource);
}
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
@Bean
public ApprovalStore approvalStore() {
return new JdbcApprovalStore(dataSource);
}
@Bean
public AuthorizationCodeServices authorizationCodeServices() {
return new JdbcAuthorizationCodeServices(dataSource);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(clientDetailsService());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.checkTokenAccess("permitAll()");
}
}
Configuration de la sécurité Web
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // TODO. Enable this!!!
http.authorizeRequests()
.and()
.formLogin()
// .loginPage("/login") // manually defining page to login
// .failureUrl("/login?error") // manually defining page for login error
.usernameParameter("email")
.permitAll()
.and()
.logout()
// .logoutUrl("/logout")
.logoutSuccessUrl("/")
.permitAll();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(customUserDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
UserDetailsService (customUserDetailsService)
@Service
public class CustomUserDetailsService implements UserDetailsService{
private final UserService userService;
@Autowired
public CustomUserDetailsService(UserService userService) {
this.userService = userService;
}
public Authority loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userService.getByEmail(email)
.orElseThrow(() -> new UsernameNotFoundException(String.format("User with email=%s was not found", email)));
return new Authority(user);
}
}
Configuration ( la plupart du code squelette a été extrais CET exemple)
@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter{
@Autowired
DataSource dataSource;
String RESOURCE_ID = "data_resource";
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
TokenStore tokenStore = new JdbcTokenStore(dataSource);
resources
.resourceId(RESOURCE_ID)
.tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
// For some reason we cant just "permitAll" OPTIONS requests which are needed for CORS support. Spring Security
// will respond with an HTTP 401 nonetheless.
// So we just put all other requests types under OAuth control and exclude OPTIONS.
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/**").access("#oauth2.hasScope('read')")
.antMatchers(HttpMethod.POST, "/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.PATCH, "/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.PUT, "/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.DELETE, "/**").access("#oauth2.hasScope('write')")
.and()
// Add headers required for CORS requests.
.headers().addHeaderWriter((request, response) -> {
response.addHeader("Access-Control-Allow-Origin", "*");
if (request.getMethod().equals("OPTIONS")) {
response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Method"));
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
}
});
}
}
Contrôleur WS:
@RestController
@RequestMapping(value = "/todos")
public class TodoController {
@Autowired
private TodoRepository todoRepository;
@RequestMapping(method = RequestMethod.GET)
public List<Todo> todos() {
return todoRepository.findAll();
}
// other methods
}
Comment puis-je implémenter un projet de client Web afin que lorsque l'utilisateur se connecte sur la page protégée ou clique sur le bouton de connexion, être redirigé vers l'URL du fournisseur OAuth, se connecter et être authentifié sur le client Web avec tous les rôles d'utilisateur et également besoin de savoir quel client a été utilisé
Vous souhaitez utiliser OAuth comme SSO.
Option 1, utilisez le nuage de printemps https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v
Option 2, gérer manuellement le processus SSO:
dans votre client Web, configurez la page de connexion au serveur OAuth à l'aide de l'autorisation d'autorisation.
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // TODO. Enable this!!!
http.authorizeRequests()
.and()
.formLogin()
.loginPage("http://oauth.web.com/oauth/authorize?response_type=code&client_id=webclient&redirect_uri=http://web.com") // manually defining page to login
//.failureUrl("/login?error") // manually defining page for login error
.usernameParameter("email")
.permitAll()
.and()
.logout()
//.logoutUrl("/logout")
.logoutSuccessUrl("/")
.permitAll();
}
une fois le processus d'authentification et d'autorisation terminé, vous serez redirigé vers le client Web avec le code d'autorisation http://web.com/?code=jYWioI
. votre client Web doit échanger ce code avec un accès par jeton sur votre serveur oauth. Sur votre serveur Oauth, créez un point de terminaison pour récupérer les informations utilisateur
@RestController
public class UserRestService {
@RequestMapping("/user")
public Principal user(Principal user) {
// you can also return User object with it's roles
// {"details":...,"principal":{"username":"user",...},"name":"user"}
return user;
}
}
Ensuite, votre client Web peut accéder aux informations sur les détails de l'utilisateur en envoyant une demande avec l'accès par jeton au point de terminaison de repos ci-dessus et authentifier l'utilisateur en fonction de la réponse.
Dois-je gérer le jeton d'accès et l'inclure toujours dans l'appel au serveur de ressources ou cela peut se faire automatiquement d'une manière ou d'une autre?
Chaque demande doit inclure un accès par jeton. Si vous voulez le faire automatiquement, Spring a fourni le client Oauth 2 http://projects.spring.io/spring-security-oauth/docs/oauth2.html
Quelle est la meilleure façon de mettre en œuvre la sécurité sur les applications mobiles que je développerai. Dois-je utiliser le mot de passe grand pour cette authentification, car les applications seront créées par moi-même où j'aurai un nom d'utilisateur et un mot de passe sur l'écran natif, puis envoyées au serveur en tant qu'authentification de base sur SSL?
Étant donné que vous utilisez l'écran natif, l'octroi de mot de passe est suffisant, mais vous pouvez stocker le jeton d'actualisation, cela vous permettra de demander l'accès au jeton sans répéter le processus d'authentification.
Y a-t-il des exemples que je peux jeter un oeil à cette conversation avec Spring Security OAuth et retourner les détails de l'utilisateur.
voir l'exemple de code ci-dessus ou jetez un œil à ce https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots