Security认证、鉴权服务

认证、鉴权服务

认证、鉴权服务介绍

认证鉴权服务基于Spring Security 、Spring cloud Oauth2实现整个框架安全认证,提供统一权限认证授权及资源访问服务解决方案,认证中心默认提供密码模式(password),并支持原生 token 交互访问业务。

OAuth2介绍

OAuth2用户是一个标准化的授权协议/框架,OAuth 2.0授权框架使第三方应用程序来获取对HTTP服务的有限访问机会。无论是通过编排资源所有者和HTTP服务之间的交互批准的资源所有者,或通过允许第三方应用程序来获取自己的访问权限。

OAuth2运行流程

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

OAuth2.0认证步骤:

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

客户端请求发出的HTTP方式:

  • grant_type:表示授权类型,此处的值固定为"password",必选项。
  • username:表示用户名,必选项。
  • password:表示用户的密码,必选项。
  • scope:表示权限范围,可选项。
POST /token HTTP/1.1
Host: /auth/oauth/token
Authorization: Bearer czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=104573622026289&password=admin123

认证服务器返回认证消息:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}

模块介绍

├── ui -- 前端工程 ├── framework-auth -- 认证、鉴权服务模块

├── framework-common -- 公用模块 ├ └── framework-common-cores -- 公共工具类核心包 ├ └── framework-common-security -- 安全工具类 ├ ├── framework-oauth -- 认证鉴权服务

├ ├──framework-system -- 组织机构权限服务

认证、鉴权服务接口

  1. 认证、鉴权服务容器配置 AuthorizationServerConfigurerAdapter、WebSecurityConfigurerAdapter

描述:我们需要向这个类中, 配置用户信息, 生成对应的AuthenticationManager, 同时作为用户身份的管理者,提供认证入口。

AuthorizationServerConfigurerAdapter介绍:

  • ClientDetailsServiceConfigurer:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息。
  • AuthorizationServerSecurityConfigurer:用来配置令牌端点(Token Endpoint)的安全约束.
  • AuthorizationServerEndpointsConfigurer:用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services)。

WebSecurityConfigurerAdapter介绍:

配置Security的认证策略,authorizeRequests()配置路径拦截,表明路径访问所对应的权限,角色,认证信息。像WebSecurityConfigurerAdapter中配置用户信息, 生成对应的AuthenticationManager作为用户身份的管理者;UserDetailsService用于获取用户的信息,本案例从数据库获取存到分布式缓存中。

protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers( "/token/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}

2.OAuth2.0 暴露获取令牌TokenEndpoint

/oauth/token:令牌端点

TokenEndpoint:用来作为请求者获得令牌(Token)的服务,默认的路径 /oauth/token,

定义授权和令牌端点以及令牌服务
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancer())
.userDetailsService(userDetailsService)
.authenticationManager(authenticationManager)
.reuseRefreshTokens(false)
.exceptionTranslator(new CustomWebResponseExceptionTranslator());
}

3.认证中心服务容器监听认证结果

ApplicationListener、ApplicationListener

MerAuthenticationSuccessEventHandler 继承 AuthenticationSuccessEvent处理成功返回认证、鉴权的结果。

public void handle(Authentication authentication) {
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(StringConstnts.CLIENT_ID);
TokenRequest tokenRequest = new TokenRequest(new HashMap<>(), StringConstnts.CLIENT_ID, clientDetails.getScope(), "password");
OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
OAuth2Authentication auth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
OAuth2AccessToken token = tokenStore.getAccessToken(auth2Authentication);
OAuth2AccessToken token1 = authorizationServerTokenServices.getAccessToken(auth2Authentication);
redisTemplate.opsForValue().set(token, authentication.getAuthorities());
log.info("用户:{} 登录成功", authentication.getPrincipal());
}

MerAuthenticationFailureEvenHandler 继承 AbstractAuthenticationFailureEvent 认证失败返回失败消息体。

public void onApplicationEvent(AbstractAuthenticationFailureEvent event) {
AuthenticationException authenticationException = event.getException();
Authentication authentication = (Authentication) event.getSource();
handle(authenticationException, authentication);
}

你可能感兴趣的:(bootstrap,postman)