今日项目搭建进度
* 【权限管理平台】项目开发Day—02
* 🍌权限数据设计&接口设计
* 🍇 权限数据设计
* 🍑 接口设计
* 🍍实际编码
* 🍔 Swagger相关配置
* 🍰 Shiro框架基础搭建相关配置
* 🍕 Shiro主要功能:
* 🍫 了解 Jwt
* 🍒 Shiro配置实际操作
🍌权限数据设计&接口设计
🍇 权限数据设计
由于这部分数据的设计设计与添加过于耗费时间(其实是因为
​懒​
),我选择在开发的过程中等这部分接口编码完毕之后,通过Swagger文档按需添加。🍑 接口设计
在平时做开发时,习惯性的把我们编写的接口称之为
​Api​
,所以,这次索性就把本项目的接口设计为 ​/api/xxx/xxx​
(其实根本算不上设计 ♨️ )。🍍实际编码
🍔 Swagger相关配置
​Swagger​
是一个规范和完整的框架,用于生成、描述、调用和可视化 ​RestFul​
风格的 ​Web​
服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
导入依赖
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>
相关配置
public class SwaggerConfig {
("${swagger2.enable}")
private boolean enable;
public Docket docket(){
List<Parameter> pars = new ArrayList<Parameter>();
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name("authorization").description("请输入Token信息")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false);
pars.add(tokenPar.build());
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.pdx.controller"))
.paths(PathSelectors.any())
.build()
.globalOperationParameters(pars)
.enable(enable);
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("派大星权限管理平台")
.description("派大星权限管理平台")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
🍰 Shiro框架基础搭建相关配置
那么什么是
​Shiro​
呢?下面我们简单了解一下这个安全框架:
​Shiro​
框架是 ​Apache​
下的一款Java安全框架,具有和 ​SpringSecurity​
一样的效果,相较于 ​SpringSecurity​
而 ​Shiro​
的特点会更加突出:* 便捷
* 易上手
* 支持注解开发
🍕 Shiro主要功能:
三个核心组件:
​Subject​
​ SecurityManager​
和 ​ Realms​
*
​Subject:​
即”当前操作用户”。但是,在 ​Shiro​
中, ​Subject​
这一概念并不仅仅指人,也可以是第三方进程、后台帐户或其他类似事物。它仅仅意味着”当前跟软件交互的东西”。*
​SecurityManager:​
它是 ​Shiro​
框架的核心,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。*
​Realm:​
Realm充当了Shiro与应用安全数据间的”桥梁”或者”连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时, ​Shiro​
会从应用配置的 ​Realm​
中查找用户及其权限信息。如果你还不了解
​shiro​
的认证机制,请移步: 🍫 了解 Jwt
​JWT​
(全称: ​Json Web Token​
)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
Jwt的数据结构
​Jwt​
一般是字符串,分为三部分,并且每部分中间用 ​"."​
隔开:![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
xxxxx.yyyyy.zzzzz
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
Jwt包括哪三部分呢?
* *Header
​JWT​
第一部分是头部分,它是一个描述JWT元数据的 ​Json​
对象,通常如下所示。![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
{ "alg": "HS256", "typ": "JWT"}
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
​alg​
属性表示签名使用的算法,默认为 ​HMAC SHA256​
(写为 ​HS256​
), ​typ​
属性表示令牌的类型, ​JWT​
令牌统一写为 ​JWT​
。* *Payload
​JWT​
第二部分是 ​Payload​
,也是一个 ​Json​
对象,除了包含需要传递的数据,还有七个默认的字段供选择。分别是,
​iss​
:发行人、 ​exp​
:到期时间、 ​sub​
:主题、 ​aud​
:用户、 ​nbf​
:在此之前不可用、 ​iat​
:发布时间、 ​jti​
: ​JWT ID​
用于标识该 ​JWT​
.* *Signature
那么它是怎么生成的呢?首先需要指定一个
​secret​
,该 ​secret​
仅仅保存在服务器中,保证不能让其他用户知道。然后使用Header指定的算法对 ​Header​
和 ​Payload​
进行计算,然后就得出一个签名哈希。也就是 ​Signature​
。🍨 优点
*
​json​
格式的通用性,所以 ​JWT​
可以跨语言支持,比如 ​Java、JavaScript、PHP、Node​
等等。* 可以利用
​Payload​
存储一些非敏感的信息。* 便于传输,
​JWT​
结构简单,字节占用小。* 不需要在服务端保存会话信息,易于应用的扩展。
🍒 Shiro配置实际操作
导入依赖
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-springartifactId>
<version>1.4.1version>
dependency>
自定义Realm类
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
public class CustomRealm extends AuthorizingRealm { public boolean supports(AuthenticationToken token) { return token instanceof CustomUsernamePasswordToken; } protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { CustomUsernamePasswordToken usernamePasswordToken = (CustomUsernamePasswordToken) token; SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(usernamePasswordToken.getPrincipal(), usernamePasswordToken.getCredentials(), getName()); return info; }}
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
自定义Shiro默认加密方式
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
public class CustomHashedCredentialsMatcher extends HashedCredentialsMatcher { private RedisService redisService; public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { CustomUsernamePasswordToken usernamePasswordToken = (CustomUsernamePasswordToken) token; String accessToken = (String) usernamePasswordToken.getCredentials(); String userId = JwtTokenUtil.getUserId(accessToken); log.info("doCredentialsMatch.....userId=>{}",userId); if (redisService.hasKey(Constant.DELETE_USER_KEY+userId)){ throw new BusinessException(BaseResponseCode.ACCOUNT_HAS_DELETE_ERROR); } if (redisService.hasKey(Constant.ACCOUNT_LOCK_KEY+userId)){ throw new BusinessException(BaseResponseCode.ACCOUNT_LOCKED); } if (redisService.hasKey(Constant.JWT_ACCESS_TOKEN_BLACKLIST+userId)){ throw new BusinessException(BaseResponseCode.TOKEN_ERROR); } if (!JwtTokenUtil.validateToken(accessToken)){ throw new BusinessException(BaseResponseCode.TOKEN_PAST_DUE); } return true; }}
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
自定义UsernamePasswordToken 类
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
public class CustomUsernamePasswordToken extends UsernamePasswordToken { private String jwtToken; public CustomUsernamePasswordToken(String jwtToken){ this.jwtToken = jwtToken; } public Object getPrincipal() { return jwtToken; } public Object getCredentials() { return jwtToken; }}
![【权限管理平台】Day—02项目搭建及Shiro相关配置](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/"请添加图片描述")
新鲜出炉的代码将会及时更新到
​Gitee​
仓库
今天的工作量就进行到这里!希望大佬们可以监督派大星一步步从0搭建该平台!
Original: https://blog.51cto.com/u_15670179/5372649
Author: 派大星i
Title: 【权限管理平台】Day—02项目搭建及Shiro相关配置
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/517512/
转载文章受原作者版权保护。转载请注明原作者出处!