本篇内容主要讲解"春天的羚羊单点登录(single sign-on的缩写)的案例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"春天的羚羊单点登录(single sign-on的缩写)的案例分析"吧!
一、依赖
相关性
groupIdorg.springframework.security.oauth.boot/groupId
artifactIdspring-security-oauth 3-自动配置/artifactId
version2.1.6.RELEASE/version
/依赖性
二、服务端
1 .服务端需要的是授权与身份验证,通过配置@EnableAuthorizationServer 、@EnableWebSecurity 、@EnableResourceServer来完成配置。
2.先来配置网络安全的配置
打包。例子。oauth
导入组织。弹簧框架。靴子。自动配置。保安。安全属性;
导入组织。弹簧框架。语境。注释。豆子;
导入组织。弹簧框架。语境。注释。配置;
导入组织。弹簧框架。核心。注释。秩序;
导入组织。弹簧框架。保安。认证。authenticationmanager
导入组织。弹簧框架。保安。配置。BeanIds
导入组织。弹簧框架。保安。配置。注释。认证。建筑商。authenticationmanagerbuilder
导入组织。弹簧框架。保安。配置。注释。网络。建筑商。httpsecurity
导入组织。弹簧框架。保安。配置。注释。网络。建筑商。网络安全;
导入组织。弹簧框架。保安。配置。注释。网络。配置。enablewebsecurity
导入组织。弹簧框架。保安。配置。注释。网络。配置。websecurityconfiguradapter
导入组织。弹簧框架。保安。核心。用户详细信息。用户;
导入组织。弹簧框架。保安。核心。用户详细信息。用户详细信息服务;
导入组织。弹簧框架。保安。密码。b加密。bcryptpasswordencoder
导入组织。弹簧框架。保安。供应。在memoryuserdetailsmanager中;
/**
*@authorsorata
* @日期2019-07-2309:19
*/
@配置
@EnableWebSecurity
@Order(SecurityProperties .BASIC_AUTH_ORDER)
publicclassWebSe
curityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService myUserDetailsService(){
return new InMemoryUserDetailsManager(User.builder().username("admin").password(passwordEncoder().encode("admin")).roles("ADMIN").build());
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserDetailsService()).passwordEncoder(passwordEncoder());
}
@Bean(BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().antMatcher("/**")
.authorizeRequests()
.antMatchers("/","/login","/oauth/**").permitAll()
.anyRequest().authenticated()
.and().httpBasic().and().formLogin()
.and().logout();
}
}
note:首先是配置用户UserDetailsService,然后配置密码策略。主要的部分是 configure(HttpSecurity http) 方法,这里当我在formLogin()后配置了验证完成转发,即successForwardUrl(“/main”)后,sso客户端请求验证完成时,不会跳转到客户端的请求地址,而是跳转到验证成功的服务端地址 /main。
3.编写一个用户信息的controller
package com.example.oauth; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.security.Principal; /** * @author sorata * @date 2019-07-23 09:17 */ @RestController public class UserController { @RequestMapping("/user") public Principal principal(Principal principal){ return principal; } @RequestMapping("/user2") public Principal principal2(Principal principal){ return principal; } }
note: 作用就是测试和之后客户端填写的服务器用户信息的url
4.资源服务器
package com.example.oauth; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth3.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth3.config.annotation.web.configuration.ResourceServerConfigurerAdapter; /** * @author sorata * @date 2019-07-23 09:50 */ @Configuration @EnableResourceServer public class ResourceConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.csrf().disable().antMatcher("/user") .authorizeRequests().anyRequest().authenticated(); } }
5.完成后的效果
6. 重要的认证服务端
package com.example.oauth; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.oauth3.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth3.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth3.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth3.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; import org.springframework.security.oauth3.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; import org.springframework.security.oauth3.provider.token.TokenStore; import org.springframework.security.oauth3.provider.token.store.InMemoryTokenStore; /** * @author sorata * @date 2019-07-23 10:06 */ @Configuration @EnableAuthorizationServer public class SsoServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private BCryptPasswordEncoder passwordEncoder; /** * 如果出现错误 在主类上去掉默认配置 * {@link SsoServerApplication} */ @Autowired private UserDetailsService detailsService; @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security.allowFormAuthenticationForClients() .tokenKeyAccess("permitAll()") .checkTokenAccess("isAuthenticated()") .passwordEncoder(passwordEncoder); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory().withClient("cocos") .secret(passwordEncoder.encode("cocos")) .autoApprove(true) .redirectUris("http://localhost:9090/client/login") .scopes("all") .authorities("ADMIN") .authorizedGrantTypes("authorization_code","password","refresh_token") .accessTokenValiditySeconds(10000) .refreshTokenValiditySeconds(10000); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager) .userDetailsService(detailsService).tokenStore(tokenStore()); } @Bean public TokenStore tokenStore(){ return new InMemoryTokenStore(); } }
三、客户端
1.客户端实现比较简单,如果想针对行的修改,自定义那么可以根据后面参考地址研读。
2.application.properties
security.oauth3.client.authentication-scheme=form security.oauth3.client.user-authorization-uri=http://localhost:8080/server/oauth/authorize security.oauth3.client.access-token-uri=http://localhost:8080/server/oauth/token security.oauth3.client.client-id=cocos security.oauth3.client.client-secret=cocos security.oauth3.resource.user-info-uri=http://localhost:8080/server/user server.servlet.context-path=/client server.port=9090
3.主类添加注解
package com.example.oauth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.oauth3.client.EnableOAuth3Sso; @SpringBootApplication @EnableOAuth3Sso public class SsoClientApplication { public static void main(String[] args) { SpringApplication.run(SsoClientApplication.class, args); } }
4.用户的接口
package com.example.oauth; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.security.Principal; /** * @author sorata * @date 2019-07-23 10:30 */ @RestController public class UserController { @RequestMapping("/user") public Principal principal(Principal principal){ return principal; } }
四、效果
note: 如果想看到
到此,相信大家对“spring oauth2 +springboot sso的案例分析”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/95852.html