Spring Security OAuth2学习
文章目录
- Spring Security
- 简介
- 依赖
- 配置类
- 自定义UserDetailsService
- 分布式认证需求
- 认证方案
- OAuth2
- jwt
- Spring Security Oauth2.0
- AuthorizationServer
- ResourceServer
- 测试:
- password模式
- 授权码模式
Spring Security
简介
SpringSecurity是为基于Spring的应用程序提供声明式安全保护的安全性框架,它提供了完整的安全性解决方案,能够在web请求级别和方法调用级别处理身份证验证和授权。因为基于Spring框架,所以SpringSecurity充分利用了依赖注入和面向切面的技术。
Spring Security主要是从两个方面解决安全性问题:
- web请求级别:使用Servlet规范中的过滤器(Filter)保护Web请求并限制URL级别的访问。
- 方法调用级别:使用Spring AOP保护方法调用,确保具有适当权限的用户才能访问安全保护的方法。
@EnableWebSecurity:
该注解启用Web安全功能(但其本身并没有什么用处,Spring Security的配置类还需实现WebSecurityConfigurer或继承WebSecurityConfigurerAdapter类,本Demo中采用后者,因为更简单去配置使用)。
WebSecurityConfigurerAdapter类:
可以通过重载该类的三个configure()方法来制定Web安全的细节。
1、 configure(WebSecurity):通过重载该方法,可配置Spring Security的Filter链。
2、configure(HttpSecurity):通过重载该方法,可配置如何通过拦截器保护请求。
3、configure(AuthenticationManagerBuilder):通过重载该方法,可配置user-detail(用户详细信息)服务。
用户信息存储方式共有三种:
1、使用基于内存的用户存储:通过inMemoryAuthentication()方法,我们可以启用、配置并任意填充基于内存的用户存储。并且,我们可以调用withUser()方法为内存用户存储添加新的用户,这个方法的参数是username。withUser()方法返回的是UserDetailsManagerConfigurer.UserDetailsBuilder,这个对象提供了多个进一步配置用户的方法,包括设置用户密码的password()方法以及为给定用户授予一个或多个角色权限的roles()方法。需要注意的是,roles()方法是authorities()方法的简写形式。roles()方法所给定的值都会添加一个ROLE_前缀,并将其作为权限授予给用户。因此上诉代码用户具有的权限为:ROLE_USER,ROLE_ADMIN。而借助passwordEncoder()方法来指定一个密码转码器(encoder),我们可以对用户密码进行加密存储。
2、基于数据库表进行认证:用户数据通常会存储在关系型数据库中,并通过JDBC进行访问。为了配置Spring Security使用以JDBC为支撑的用户存储,我们可以使用jdbcAuthentication()方法,并配置他的DataSource,这样的话,就能访问关系型数据库了。
3、基于LDAP进行认证:为了让Spring Security使用基于LDAP的认证,我们可以使用ldapAuthentication()方法。
Ant风格URL语法,apache的Ant样式的路径有三种通配符匹配方法,利用它们可以组合出多种路径模式:
Wildcard | Description |
---|---|
? | 匹配任意单字符 |
* | 匹配0或者任意数量的字符,不包含/ |
** | 匹配0或者更多数量的目录,不包含/ |
依赖
<!--spring security--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
配置类
@EnableWebSecurity
@Configuration
@Slf4j
public class WebServerSecuityConfig extends WebSecurityConfigurerAdapter {@AutowiredCustomUserDetailsService customUserDetailsService;/*** 通过重载该方法,可配置如何通过拦截器保护请求。* @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {//禁用csrf防御机制http.csrf().disable();//配置请求拦截策略http.authorizeRequests()//访问/free、/autuator/**、/add的路径请求允许通过.antMatchers("/free","/actuator/**","/add").permitAll()//其他请求需要认证.anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}/*** 注入自定义的userDetailsService实现,获取用户信息,设置密码加密方式** @param auth* @throws Exception*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(customUserDetailsService).passwordEncoder(getPasswordEncoder());}@Beanpublic PasswordEncoder getPasswordEncoder(){return new BCryptPasswordEncoder();}/*** 将 AuthenticationManager 注册为 bean , 方便配置 oauth server 的时候使用* @return* @throws Exception*/@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception{return super.authenticationManagerBean();}
}
自定义UserDetailsService
重写loadUserByUsername()
@Service
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {@AutowiredIUserService userService;@AutowiredIRoleService roleService;@Overridepublic UserDetails loadUserByUsername(String uniqueId) throws UsernameNotFoundException {User user = userService.getByUniqueId(uniqueId);log.info("loadUserByUsername"+user);return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getEnabled(),user.getAccountNonExpired(),user.getCredentialsNonExpired(),user.getAccountNonLocked(),obtainGrantedAuthorities(user));}/*** 获得登录者所有角色的权限集合.** @param user* @return*/private Set<GrantedAuthority> obtainGrantedAuthorities(User user){List<Role> roles = roleService.queryByUserId(user.getId());return roles.stream().map(role -> new SimpleGrantedAuthority(role.getCode())).collect(Collectors.toSet());}}
分布式认证需求
分布式系统的每个服务都会有认证、授权的需求,如果每个服务都实现一套认证授权逻辑会非常冗余,考虑分布式系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求;考虑分布式系统开放性的特点,不仅对系统内部服务提供认证,对第三方系统也要提供认证。分布式认证的需求总结如下:
统一认证授权
提供独立的认证服务,统一处理认证授权。
无论是不同类型的用户,还是不同种类的客户端(web端,H5、APP),均采用一致的认证、权限、会话机制,实现统一认证授权。
要实现统一则认证方式必须可扩展,支持各种认证需求,比如:用户名密码认证、短信验证码、二维码、人脸识别等认证方式,并可以非常灵活的切换
应用接入认证
应提供扩展和开放能力,提供安全的系统对接机制,并可开放部分API给接入第三方使用,一方应用(内部
系统服务)和三方应用(第三方应用)均采用统一机制接入。
认证方案
基于session的认证方式
在分布式的环境下,基于session的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通过负载均衡将本地的请求分配到另一个应用服务需要将session信息带过去,否则会重新认证。这个时候,通常的做法有下面几种:
Session复制:多台应用服务器之间同步session,使session保持一致,对外透明
Session黏贴:当用户访问集群中某台服务器后,强制指定后续所有请求均落到此机器上。
Session集中存储:将Session存入分布式缓存中,所有服务器应用实例统一从分布式缓存中存取Session。
总体来讲,基于session认证的认证方式,可以更好的在服务端对会话进行控制,且安全性较高。但是,session机制方式基于cookie,在复杂多样的移动客户端上不能有效的使用,并且无法跨域,另外随着系统的扩展需提高session的复制、黏贴及存储的容错性。
基于token的认证方式
token也需要存储在服务端,JWT不用。请求登录时,token和sessionId原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:‘字符串’}返回给客户端。客户端通过cookie、sessionStorage、localStorage都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器端就可以通过token信息查找用户登录状态。
token和jwt存在什么区别
token需要查库验证token 是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,并且不用查库。因为用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT自己实现的。 TOKEN 概念: 令牌, 是访问资源的凭证。
流程描述:
(1)用户通过接入方(应用)登录,接入方采取OAuth2.0方式在统一认证服务(UAA)中认证。
(2)认证服务(UAA)调用验证该用户的身份是否合法,并获取用户权限信息。
(3)认证服务(UAA)获取接入方权限信息,并验证接入方是否合法。
(4)若登录用户以及接入方都合法,认证服务生成jwt令牌返回给接入方,其中jwt中包含了用户权限及接入方权限。
(5)后续,接入方携带jwt令牌对API网关内的微服务资源进行访问。(通过资源服务器?)
(6)API网关对令牌解析、并验证接入方的权限是否能够访问本次请求的微服务。
(7)如果接入方的权限没问题,API网关将原请求header中附加解析后的明文Token,并将请求转发至微服务。
(8)微服务收到请求,明文token中包含登录用户的身份和权限信息。因此后续微服务自己可以干两件事:用户授权拦截(看当前用户是否有权访问该资源) 将用户信息存储进当前线程上下文(有利于后续业务逻辑随时获取当前用户信息)
流程所涉及到UAA服务、API网关这三个组件职责如下:
统一认证服务(UAA) 它承载了OAuth2.0接入方认证、登入用户的认证、授权以及生成令牌的职责,完成实际的用户认证、授权功能。
API网关
作为系统的唯一入口,API网关为接入方提供定制的API集合,它可能还具有其它职责,如身份验证、监控、负载均衡、缓存等。API网关方式的核心要点是,所有的接入方和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。
OAuth2
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0。很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
jwt
JWT(JSON WEB TOKEN) 是由三段信息构成的,第一段为头部(Header),第二段为载荷(Payload),第三段为签名(Signature)。每一段内容都是一个 JSON 对象,将每一段 JSON 对象采用 BASE64 编码,将编码后的内容用. 链接一起就构成了 JWT 字符串。
头部:header 部分主要是两部分内容,一个是 Token 的类型,另一个是加密使用的算法,比如类型 JWT,算法 HS256。
载荷:payload中用于存放用户名、token的生成时间和过期时间。注意不能存放敏感信息。因为这部分相当于明文
签名:以header和payload通过服务器私有的密钥进行加密生成的签名
1、用户用用户名和密码登录,登录成功后服务端返回一个Token给客户端。
2、客户端得到Token后,要访问其他资源,请求中带着Token去服务端。
3、服务端接收到请求后对取出token的头部(header)、载荷(playload),并对两者通过密钥进行加密,生成新的Signature与token中的签名对比,一致则通过(所以一旦header和payload被篡改,验证将失败。)。
Spring Security Oauth2.0
文档:https://projects.spring.io/spring-security-oauth/docs/oauth2.html
数据库脚本 https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql
The Spring Security OAuth project is deprecated. The latest OAuth 2.0support is provided by Spring Security. See the OAuth 2.0 Migration Guide for further details.
OAuth 2.0提供程序机制负责公开受OAuth 2.0保护的资源。该配置涉及建立OAuth 2.0客户端,这些客户端可以独立或代表用户访问其受保护的资源。提供者通过管理和验证用于访问受保护资源的OAuth 2.0令牌来做到这一点。
OAuth 2.0中的提供者角色实际上是在授权服务和资源服务之间分配的,尽管它们有时驻留在同一应用程序中,但使用Spring Security OAuth,您可以选择将它们拆分到两个应用程序中,并具有多个共享的资源服务授权服务。对令牌的请求由Spring MVC控制器端点处理,对受保护资源的访问由标准Spring Security请求过滤器处理。为了实现OAuth 2.0授权服务器,Spring Security过滤器链中需要以下端点:
AuthorizationEndpoint用于服务于授权请求。预设网址:/oauth/authorize。
TokenEndpoint用于服务访问令牌的请求。预设网址:/oauth/token。
AuthorizationServer
AuthorizationServerConfigurerAdapter要求配置以下几个类,这几个类是由Spring创建的独立的配置对象,它们会被Spring传入AuthorizationServerConfigurer中进行配置。
public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {public AuthorizationServerConfigurerAdapter() {}public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {}public void configure(ClientDetailsServiceConfigurer clients) throws Exception {}public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {}
}
ClientDetailsServiceConfigurer:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息。
AuthorizationServerSecurityConfigurer:定义令牌端点上的安全约束。
AuthorizationServerEndpointsConfigurer:用来配置令牌(token)的访问端点和令牌服务(token services)。
授权服务配置总结:授权服务配置分成三大块,可以关联记忆。
既然要完成认证,它首先得知道客户端信息从哪儿读取,因此要进行客户端详情配置。
既然要颁发token,那必须得定义token的相关endpoint,以及token如何存取,以及客户端支持哪些类型的token。
既然暴露除了一些endpoint,那对这些endpoint可以定义一些安全上的约束等。
Spring Security OAuth2存储token值的方式由多种,所有的实现方式都是实现了TokenStore接口
InMemoryTokenStore
:token存储在本机的内存之中
JdbcTokenStore
:token存储在数据库之中
JwtTokenStore
:token不会存储到任何介质中
RedisTokenStore
:token存储在Redis数据库之中
认证服务器配置,端口7701
@EnableAuthorizationServer
@Configuration
@Slf4j
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@AutowiredDataSource dataSource;@AutowiredAuthenticationManager authenticationManager;@Autowired@Qualifier("CustomUserDetailsService")UserDetailsService userDetailsService;/*** jwt 对称加密密钥 AuthorizationServer和ResourceServer的加密密钥需要一致*/@Value("${spring.security.oauth2.jwt.signingKey}")private String signingKey;/*** 定义令牌端点上的安全约束。* @param security* @throws Exception*/@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {// 支持将client参数放在header或body中security.allowFormAuthenticationForClients().tokenKeyAccess("isAuthenticated()")//oauth/check_token公开.checkTokenAccess("permitAll()");}/*** 定义客户端详细信息服务的配置程序。可以初始化客户详细信息,或者您可以仅引用现有store。* @param clients* @throws Exception*/@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// 配置客户端信息,从数据库中读取,对应oauth_client_details表clients.jdbc(dataSource);}/*** 定义授权和令牌端点以及令牌服务。* @param endpoints* @throws Exception*/@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {// 配置token的数据源、自定义的tokenServices等信息,配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactoryendpoints.tokenStore(tokenStore()).authorizationCodeServices(authorizationCodeServices()).approvalStore(approvalStore()).tokenEnhancer(tokenEnhancerChain()).authenticationManager(authenticationManager).userDetailsService(userDetailsService);
// //update by joe_chen add granter
// .tokenGranter(tokenGranter(endpoints));}/*** token的持久化** @return JwtTokenStore*/@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}/*** jwt token的生成配置* JwtTokenStore:token不会存储到任何介质中?* @return*/@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey(signingKey);return converter;}/*** 授权码模式持久化授权码code** @return JdbcAuthorizationCodeServices*/@Beanprotected AuthorizationCodeServices authorizationCodeServices() {// 授权码存储等处理方式类,使用jdbc,操作oauth_code表return new JdbcAuthorizationCodeServices(dataSource);}/*** 授权信息持久化实现** @return JdbcApprovalStore*/@Beanpublic ApprovalStore approvalStore() {return new JdbcApprovalStore(dataSource);}/*** 自定义token** @return tokenEnhancerChain*/@Beanpublic TokenEnhancerChain tokenEnhancerChain() {TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(new CustomTokenEnhancer(), accessTokenConverter()));return tokenEnhancerChain;}
}
ResourceServer
资源服务器(可以与授权服务器或单独的应用程序相同)为受OAuth2令牌保护的资源提供服务。Spring OAuth提供了实现此保护的Spring Security身份验证过滤器。您可以使用@EnableResourceServer在@Configuration类上将其打开,并使用进行配置(根据需要)ResourceServerConfigurer。可以配置以下功能:
tokenServices:定义令牌服务(的实例ResourceServerTokenServices)的bean 。
resourceId:资源的ID(可选,但建议使用,并且将由auth服务器验证(如果存在))。
资源服务器的其他扩展点(例如,tokenExtractor用于从传入请求中提取令牌) 请求受保护资源的匹配器(默认为全部)
受保护资源的访问规则(默认为普通的“已认证”) HttpSecuritySpring Security中配置程序允许的受保护资源的其他自定义
资源服务器配置,端口7702
@EnableResourceServer
@Configuration
@Slf4j
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {/*** jwt 对称加密密钥 AuthorizationServer和ResourceServer的加密密钥需要一致*/@Value("${spring.security.oauth2.jwt.signingKey}")private String signingKey;@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {resources.tokenStore(tokenStore()).resourceId("WEBS");}@Overridepublic void configure(HttpSecurity http) throws Exception {log.debug("ResourceServer Configure HttpSecurity method");http.csrf().disable();http.authorizeRequests().antMatchers("/actuator/**").permitAll().antMatchers("/getByUniqueId").permitAll().antMatchers("/queryUserRoles").permitAll().antMatchers("/add").permitAll().antMatchers("/free").permitAll().antMatchers("/v2/api-docs").permitAll().anyRequest().authenticated();}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey(signingKey);return converter;}
}
测试:
下面是框架提供的URL路径:
/oauth/authorize:授权端点。 /oauth/token:令牌端点。
/oauth/confirm_access:用户确认授权提交端点。 /oauth/error:授权服务错误信息端点。
/oauth/check_token:用于资源服务访问的令牌解析端点。
/oauth/token_key:提供公有密匙的端点,如果你使用JWT令牌的话。 参数列表介绍:client_id:客户端准入标识。 client_secret:客户端秘钥。
grant_type:授权类型,填写password表示密码模式 username:资源拥有者用户名。 password:资源拥有者密码。
redirect_uri:申请授权码时的跳转url
采用OAuth2.0的密码模式从认证服务器上获取token 使用该token通过访问资源服务器的测试资源
1、通过访问7701端口的授权及获取令牌,获取token。
2、拿到token之后使用Token访问7702端口中的test接口进行测试
7702端口test接口如下
@GetMapping("/test")public String test(){String principal = getUserName(SecurityContextHolder.getContext().getAuthentication());log.info("用户--------"+principal);return "用户------"+principal;}private String getUserName(Authentication authentication){if (!(authentication instanceof OAuth2Authentication))return null;OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication;Authentication userAuthentication = oAuth2Authentication.getUserAuthentication();return userAuthentication.getName();}
password模式
1. 获取token
//post请求下
localhost:7701/oauth/token?client_id=client_1&client_secret=123456&redirect_url=http://baidu.com&grant_type=password&username=wecgwm&password=123456
2. 返回token
{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDUxOTI1NjUsInVzZXJfbmFtZSI6IndlY2d3bSIsImp0aSI6ImRSbkM4c1QzT0xiM3g2RzV1UlRYLUg2cTBBRSIsImNsaWVudF9pZCI6ImNsaWVudF8xIiwic2NvcGUiOlsicmVhZCJdLCJvcmdhbml6YXRpb24iOiJ3ZWNnd20ifQ.4d_BDohlQKaie7HHIS4lnUlbhh0OCi7Zc30kRZ_KlP4","token_type": "bearer","refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ3ZWNnd20iLCJzY29wZSI6WyJyZWFkIl0sIm9yZ2FuaXphdGlvbiI6IndlY2d3bSIsImF0aSI6ImRSbkM4c1QzT0xiM3g2RzV1UlRYLUg2cTBBRSIsImV4cCI6MTYwNTI5MzM2NSwianRpIjoiUWVxU0EyNUVXa3pSU0JKYTFDU3ZGOWpydEJjIiwiY2xpZW50X2lkIjoiY2xpZW50XzEifQ.tshnuiiijE-2mY1LUhH4d8SrJdk-thqvElOZIxczeqM","expires_in": 7199,"scope": "read","organization": "wecgwm","jti": "dRnC8sT3OLb3x6G5uRTX-H6q0AE"
}
3. 直接访问7702端口下/test接口,返回
{"error": "unauthorized","error_description": "Full authentication is required to access this resource"
}
4. 携带token访问7702端口下/test接口,返回
授权码模式
1. 在浏览器中访问OAuth2 服务器的认证接口
http://localhost:7701/oauth/authorize?response_type=code&client_id=client_1&redirect_uri=http://baidu.com
访问认证接口成功之后,浏览器会跳转到OAuth2配置的登录页或者默认的security登录,正确输入用户名/密码之后。浏览器将会在重定向的地址上返回一个code。如下:
https://www.baidu.com/?code=Q2pEBq
2. 使用获取到的code访问OAuth2认证服务器获取access_token
//post请求下
http://localhost:7701/oauth/token?grant_type=authorization_code&code=Q2pEBq&client_id=client_1&client_secret=123456&redirect_uri=http://baidu.com
3. 返回token
{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDUxOTM4MTgsInVzZXJfbmFtZSI6IndlY2d3bSIsImp0aSI6IldEb0pTd2NkaWsxbjRCeVI0NEU0T3lTYk1uWSIsImNsaWVudF9pZCI6ImNsaWVudF8xIiwic2NvcGUiOlsicmVhZCJdLCJvcmdhbml6YXRpb24iOiJ3ZWNnd20ifQ.-754sYPjAqdJEv8PmgXXouhsd755SKLGLgRS4oauBV4","token_type": "bearer","refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ3ZWNnd20iLCJzY29wZSI6WyJyZWFkIl0sIm9yZ2FuaXphdGlvbiI6IndlY2d3bSIsImF0aSI6IldEb0pTd2NkaWsxbjRCeVI0NEU0T3lTYk1uWSIsImV4cCI6MTYwNTI5NDYxOCwianRpIjoib2RITnZhZk8xUEFnWlJLZWg5RFZpNml4a3JvIiwiY2xpZW50X2lkIjoiY2xpZW50XzEifQ.tWfmQW6MWKcUOKO8z6RdOYMl9vozsMwFkyh3BbzhxR8","expires_in": 7199,"scope": "read","organization": "wecgwm","jti": "WDoJSwcdik1n4ByR44E4OySbMnY"
}
4. 携带token访问7702端口下/test接口,返回
用户------wecgwm
Spring Security OAuth2学习相关推荐
- Spring Security OAuth2 入门,linux操作系统学习
在授权码模式下,允许为空. 可能有部分胖友是 Windows 电脑,可以参考 <windows(64位)下使用 curl 命令> 来安装一个 curl 命令. 当然,如果胖友使用 Post ...
- 004-云E办_学习Oathu2和Spring Security Oauth2
这里写目录标题 一.Oauth2简介 1.简介 2.分析Oauth2认证的例子,网站使用微信认证的过程: 3.Oauth2.0认证流程如下: 1.角色: 2.常用术语: 3.令牌类型 4.特点 二.授 ...
- java oauth sso 源码_基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践
概 述 在前文<基于Spring Security和 JWT的权限系统设计>之中已经讨论过基于 Spring Security和 JWT的权限系统用法和实践,本文则进一步实践一下基于 Sp ...
- 学成在线-第16天-讲义- Spring Security Oauth2 JWT RSA加解密
学成在线-第16天-讲义- Spring Security Oauth2 JWT 1 用户认证需求分析 1.1 用户认证与授权 截至目前,项目已经完成了在线学习功能,用户通过在线学习页面点播视频进 ...
- 微信官方你真的懂OAuth2?Spring Security OAuth2整合企业微信扫码登录
❝ 企业微信扫码登录DEMO参见文末. 现在很多企业都接入了企业微信,作为私域社群工具,企业微信开放了很多API,可以打通很多自有的应用.既然是应用,那肯定需要做登录.正好企业微信提供了企业微信扫码授 ...
- 还不了解Oauth2协议?这篇文章从入门到入土让你了解Oauth2以及Spring Security OAuth2 的使用
SpringSecurityOAuth2学习和实战 1.OAuth2概述 1.1 什么是OAuth2 OAuth(Open Authorization)是一个关于授权(authorization)的开 ...
- Spring Security OAuth2.0认证授权知识概括
Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...
- 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...
- 芋道 Spring Security OAuth2 入门
芋道 Spring Security OAuth2 入门 总阅读量:28123次 <Dubbo 实现原理与源码解析 -- 精品合集> <Netty 实现原理与源码解析 -- 精品合集 ...
最新文章
- ubuntu13.04下安装jdk7
- BUUCTF [FlareOn1]Bob Doge [GXYCTF2019]
- CF938G Shortest Path Queries(线性基,线段树分治,并查集)
- vue垂直布局_vue实现长图垂直居上 vue实现短图垂直居中
- 为啥有人说每个程序员都应该这学习5种编程语言?
- [转载] 如何用一个Python示例入门TensorFlow?
- Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法
- xftp找不到匹配的outgoing encryption 算法 怎么解决
- 03. Use const whenever possible
- 如何救队友_PS4《高达EXVSMBON》:如何违抗拥有巴力的他?
- Spark SQL External Data Sources JDBC官方实现写测试
- Python实现向量自回归(VAR)模型——完整步骤
- “十三五”输电通道规模倍增 重点建设配电网
- 绕线画算法python_绕字的意思、绕的繁体字、绕的笔顺笔画、绕字部首和繁体字绕的意思...
- 网络安全:ARP和IP协议
- AI软件编辑文字时出现“滚滚长江东逝水”解决方法
- OpenCV C++案例实战二《生成蒙太奇图像》
- 搞透并发编程---可见性
- handsome主题美化(二)- 底部页脚版权美化
- Cityscapes数据集(智能驾驶场景的语义分割)