Oauth2权限认证系统使用文档
权限认证系统 这是我自己做的一个权限系统的对接文档,需要了解互相交流的可以私信我。 需求分析
权限认证系统基于 和 cloud 实现的为各个业务系统提供认证,权限控制,包括按钮,菜单,接口级别的权限,以及用户,角色token 权限管理·(中国)官方网站imToken,权限资源的管理。业务系统只需求按照要求接入配置,就可以完成系统间授权,联合登陆,并且解决了开发api。
详细设计
技术分析 用于REST/APIs的代理授权 框架( )基于令牌Token的授权, 在无需暴露用户密码的情 况下,使应用能获取对用户数据的有限访问权限解耦认证和授权事实上的标准安全框架, 支持多种用例场景:
(1)服务器端
(2)浏览器单页SPA
(3)无线/原生App
(4)服务器对服务器之间
OAuth 2.0不是一个认证协议, OAuth 2.0本身并不能告诉你任何用户信息
实现方案
/**
* 配置客户端详情
*
* @param clients
* @throws Exception
*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
super.configure(clients);
/**
* 数据库方式
*/
clients.withClientDetails(new JdbcClientDetailsService(dataSource));
/**
* 配置方式
*/
// clients.withClientDetails(new JdbcClientDetailsService(dataSource));
// clients.inMemory() // 使用内存存储客户端信息
// .withClient("boot-oauth2") // client_id
// .redirectUris("http://localhost:8081/oauth2/callback")
// .secret("oauth2") // client_secret
// .authorizedGrantTypes("authorization_code", "password", "client_credentials", "client_credentials") // 该client允许的授权类型
// .accessTokenValiditySeconds(3600) // Token 的有效期
// .scopes("scope") // 允许的授权范围
// .autoApprove(true); //登录后绕过批准询问(/oauth/confirm_access)
}
通过认证客户端id和客户端密钥,颁发令牌给客户端,客户端通过令牌去访问资源服务器;
@Data
@Builder
public class AccessToken implements Serializable {
/**
* 令牌
*/
private String accessToken;
/**
* 令牌类型
*/
private String tokenType;
/**
* 令牌过期时间
*/
private String expiresIn;
/**
* 刷新令牌
*/
private String refreshToken;
}
@RestController
@RequestMapping("/resources")
public class OAuth2ResourceController {
}
@Controller
@RequestMapping("/oauth2")
@Slf4j
public class OAuth2Controller {
@Autowired
private OAuth2Service oAuth2Service;
@Autowired
private OAuth2ClientConfigProperties clientConfigProperties;
@RequestMapping("/authorize")
public ModelAndView authorize(HttpServletRequest request, HttpServletResponse response) {
try {
String applyForTokenUri = oAuth2Service.authorize(request, response);
return new ModelAndView(new RedirectView(applyForTokenUri));
} catch (Exception e) {
return null;
}
}
@RequestMapping("/callback")
public ModelAndView authorize(HttpServletRequest request, HttpServletResponse response, String code) {
try {
OAuth2Token oAuth2Token = oAuth2Service.getOAuth2Token(code);
//设置当前登录用户信息
oAuth2Service.currentUserLogin(oAuth2Token, request);
response.addHeader("Authorization", "Bearer " + oAuth2Token.getAccessToken());
log.info("oauth2Token:{}", oAuth2Token);
return new ModelAndView(new RedirectView(clientConfigProperties.getClientUri()));
} catch (Exception e) {
return null;
}
}
}
获取成功后,通过token去获取资源。
资源服务器与授权服务器本质上是一个服务,只是一部分服务资源被保护起来了。
权限系统功能展示 角色管理
角色管理页面可以管理角色信息,并给角色绑定资源
用户授权
用户授权页面是专门为用户绑定角色的页面
项目管理
项目管理页面是添加接入权限平台项目信息的页面,只有添加了项目才可以使用权限平台。
字典管理
接入使用
<dependency>
<groupId>org.lht.boot.security</groupId>
<artifactId>oauth2-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
boot:
security:
oauth2:
client:
serverUri: http://localhost:8080/ #授权服务接口
clientUri: http://localhost:8081/cloud_rbac/ #客户端接口
clientId: boot-oauth2 #项目标识
clientSecret: oauth2 #项目密钥
grantType: authorization_code #授权模式
spring:
main:
allow-bean-definition-overriding: true
注意:
客户端系统:客户端系统即接入权限的系统
授权服务器:权限管理平台