济宁网站开发招聘,建设一个网站的基本成本,腾讯云cdn加速wordpress,自助建站加盟文章目录 0、OAuth2服务端结构1、授权服务配置2、授权服务器 ⇒ 配置客户端详情3、授权服务器 ⇒ 管理令牌配置4、授权服务器#xff1a;配置端点访问的安全约束5、资源服务器配置 相关#x1f4d5;#xff1a;
【OAuth2授权服务器配置完整Demo】 0、OAuth2服务端结构
OAu… 文章目录 0、OAuth2服务端结构1、授权服务配置2、授权服务器 ⇒ 配置客户端详情3、授权服务器 ⇒ 管理令牌配置4、授权服务器配置端点访问的安全约束5、资源服务器配置 相关
【OAuth2授权服务器配置完整Demo】 0、OAuth2服务端结构
OAuth2服务的提供端包括两部分
授权服务负责校验接入的客户端、登录的用户账户是否合法以及颁发token资源服务校验token返回资源信息 比如创建两个服务uua服务用来做授权服务order服务用来做资源服务。
1、授权服务配置
Spring Security Oauth核心依赖
dependencygroupIdorg.springframework.security.oauth/groupIdartifactIdspring-security-oauth2/artifactIdversion2.4.1/version
/dependency用 EnableAuthorizationServer 注解并继承AuthorizationServerConfigurerAdapter来配置OAuth2.0 授权服务器。 或者直接去实现AuthorizationServerConfigurer接口都一样
Configuration
EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {//略...
}授权服务器中需要配置以下三点 ClientDetailsServiceConfigurer用来配置客户端详情服务看支持哪些客户端来请求 AuthorizationServerEndpointsConfigurer解决两点客户端来申请令牌了申请的地址是什么令牌端点以及令牌怎么发放 AuthorizationServerSecurityConfigurer配置令牌端点的安全约束哪些url开放哪些需要鉴权
2、授权服务器 ⇒ 配置客户端详情
通过ClientDetailsServiceConfigurer来配置客户端详情。而一个ClientDetails对象则是表示一个客户端的详情包括客户端的ID、密码、授权范围、授权类型等。相关属性
clientId客户端IDsecret客户端密钥scope限制客户端的访问范围authorizedGrantTypes授权类型authorities客户端可以使用的权限
配置客户端详情可以通过内存和数据库的方式 方式一 客户端详情ClientDetails的查询要通过ClientDetailsService可以直接用框架的JdbcClientDetailsService。也可自己实现ClientDetailsService接口和ClientRegistrationService接口的类用于加载和增删改客户端详情信息。然后如下设置客户端详情服务
Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.withClientDetails(clientDetailsService)//...JdbcClientDetailsService相关源码 方式二 在内存中配置客户端详情服务硬编码或者使用配置文件Value读取实现写活。如下
/*** Oauth2.0客户端角色的信息来源内存、数据库* 这里用内存做测试*/
Override
public void configure(ClientDetailsServiceConfigurer clientDetailsServiceConfigurer) throws Exception {clientDetailsServiceConfigurer.inMemory() //使用内存.withClient(c1) //client_id.secret(new BCryptPasswordEncoder().encode(123321)) //客户端密钥.resourceIds(res1,res2) //资源列表一个标识后面配置资源服务会用到.authorizedGrantTypes(authorization_code,password, client_credentials, implicit, refresh_token) //支持的授权模式这里即四种都支持.scopes(all) //允许授权的范围一个标识.autoApprove(false) //不自动授权即跳转到授权页面让用户授权.redirectUris(http://your_url); //验证回调地址授权码通过302重定向方法这里要验证回调地址是否被恶意篡改//后面继续链式调用and方法可以配置第二个客户端的信息}通过以上配置Spring Security将会在内存中或者数据库中加载客户端详情并在认证和授权过程中使用这些信息来验证和授权客户端的请求。
3、授权服务器 ⇒ 管理令牌配置
AuthorizationServerTokenServices接口定义了令牌操作方法 其实现类是DefaultTokenServices 该实现类聚合了TokenStore接口做持久化令牌令牌存储策略。其实现类 InMemoryTokenStore令牌存内存中JdbcTokenStore令牌写进数据库JwtTokenStoreJWT令牌服务端自行解析
以下演示内存中的先定义TokenStore
Configuration
public class TokenConfig {//令牌存储策略Beanpublic TokenStore tokenStore() {//放内存return new InMemoryTokenStore();}
}定义AuthorizationServerTokenServices使用其实现类DefaultTokenServices这里设置token的相关配置
//注入上面定义的令牌存储策略的Bean
Autowired
private TokenStore tokenStore;//注入客户端详情服务定义下这个Bean是实现方式JDBC、内存、自己实现这个接口
Autowired
private ClientDetailsService clientDetailsService;//token令牌管理
Bean
public AuthorizationServerTokenServices tokenServices() {DefaultTokenServices tokenServices new DefaultTokenServices();tokenServices.setClientDetailsService(clientDetailsService); //客户端信息服务即向哪个客户端颁发令牌tokenServices.setSupportRefreshToken(true); //支持产生刷新令牌tokenServices.setTokenStore(tokenStore); //令牌的存储策略tokenServices.setAccessTokenValiditySeconds(7200); //令牌默认有效期2小时tokenServices.setRefreshTokenValiditySeconds(259200); //refresh_token默认有效期三天return tokenServices;
}定义好这令牌存储和令牌配置的两个Bean下面重写第二个configure方法
Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {//你的逻辑
}这个方法AuthorizationServerEndpointsConfigurer类型的形参可以配置授权服务器支持的授权类型
authenticationManager配置认证管理器以支持密码模式userDetailsService配置这个说明有自己的UserDetailsService接口实现此后refresh_token获取新令牌框架会去检查当前账户是否有效如是否被禁用authorizationCodeServices配置授权码服务以支持授权码模式implicitGrantService隐式授权模式需要tokenGranter配置这个说明要自定义授权逻辑
示例
/*** 授权信息保存策略*/
Bean
public ApprovalStore approvalStore(){return new InMemoryApprovalStore();
}//AuthenticationManager对象在Oauth2认证服务中要使用提取放到IOC容器中实现WebSecurityConfigurerAdapter的安全配置类中配置
Override
Bean
public AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();
}//设置授权码模式下授权码如何存储
Bean(name jdbcAuthorizationCodeServices)
public AuthorizationCodeServices authorizationCodeServices(){return new InMemoryAuthorizationCodeServices();
}/*** 令牌端点访问和令牌服务令牌怎么生成、怎么存储等*/
Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager) //设置认证管理器密码模式需要.authorizationCodeServices(authorizationCodeServices) //授权码模式需要.approvalStore(approvalStore).tokenServices(tokenServices()) //token管理服务.allowedTokenEndpointRequestMethods(HttpMethod.POST); //允许Post方式访问
}最后配置授权端点的URL框架默认URL为
/oauth/authorize授权端点/oauth/token令牌端点/oauth/confirm_access用户确认授权提交端点/oauth/error授权服务错误信息端点/oauth/check_token用于资源服务访问的令牌解析端点/oauth/token_key提供公有密匙的端点如果你使用JWT令牌的话AuthorizationServerEndpointsConfigurer的pathMapping方法可以把这些默认的URL替换成自己定义的URL形参1为默认链接形参2为新的自定义的URL链接
4、授权服务器配置端点访问的安全约束
在这里配置框架提供的端点url哪些是可以对外公开的比如下面即check/token接口对外公开
/*** token令牌端点访问的安全策略* 不是所有人都可以来访问框架提供的这些令牌端点的*/
Override
public void configure(AuthorizationServerSecurityConfigurer authorizationServerSecurityConfigurer) throws Exception {authorizationServerSecurityConfigurer.tokenKeyAccess(permitAll()) //oauth/token_key这个端点url是公开的不用登录可调.checkTokenAccess(permitAll()) // oauth/check_token这个端点是公开的.allowFormAuthenticationForClients(); //允许客户端表单认证申请令牌
}5、资源服务器配置
Spring Security Oauth核心依赖
dependencygroupIdorg.springframework.security.oauth/groupIdartifactIdspring-security-oauth2/artifactIdversion2.4.1/version
/dependency在资源服务做token校验合法且权限匹配则返回数据资源。配置方式 用 EnableResourceServer注解并继承 ResourceServerConfigurerAdapter或实现ResourceServerConfigurer来配置OAuth2.0 授权服务器。 Configuration
EnableResourceServer
EnableGlobalMethodSecurity(securedEnabled true)
public class OAuthSourceConfig extends ResourceServerConfigurerAdapter {public static final String RESOURCE_ID res1;ResourceResourceServerTokenServices resourceServerTokenServices;Beanpublic TokenStore tokenStore() {//放内存return new InMemoryTokenStore();}Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.resourceId(RESOURCE_ID) //资源id.tokenStore(tokenStore()) //告诉资源服务token在库里.tokenServices(resourceServerTokenServices).stateless(true);}Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests()//这就是给客户端发token时的scope这里会校验scope标识.antMatchers(/**).access(#oauth2.hasAnyScope(all)).and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);}
}
通过ResourceServerSecurityConfigurer对象配置
resourceId资源ID对应授权服务器里的资源ID标识tokenServicesResourceServerTokenServices 类的实例tokenStore指定令牌在哪儿如何访问
关于ResourceServerTokenServices其用来验证token。如何授权服务和资源服务在一个应用上可用DefaultTokenServices使用/oauth/check_token这个端点去校验令牌。反之需要使用远程token服务RemoteTokenServices指定授权服务器校验token的地址。以及自己的密钥和客户端ID
Configuration
public class BeanConfig {Beanpublic ResourceServerTokenServices tokenServices() {RemoteTokenServices services new RemoteTokenServices();services.setCheckTokenEndpointUrl(http://localhost:9009/oauth/check_token);services.setClientId(c1);services.setClientSecret(123);return services;}
}