整体介绍
security-oauth2 提供了一套完善的token认证授权体系,同时也提供一些配置类,让我们继承,重写的手段,做自己想要的配置。token的存储方式有多种,本章内容只讲解JWT存储方式的配置
1. 利用java提供的keytool工具生成密钥 ( .jks 或者 .keystore 文件)
打开黑窗口,运行命令:keytool -genkeypair -alias 【别名】-keyalg 【加密算法】 -keypass 【私钥的密码】 -keystore 【密钥库的名称】.【密钥库的后缀】 -storepass 【密钥库口令】
完整案列:keytool -genkeypair -alias alias -keyalg RSA -keypass keypass -keystore test.keystore -storepass storepass
命令执行之后,会弹出如下窗口
最后输入y,敲回车结束窗口,随即会在黑窗口当前目录下产生一个名为"test.keystore"的文件,这个就是密钥,其中包含了私钥和公钥
继续执行命令(查看密钥):keytool -list -rfc --keystore test.keystore | openssl x509 -inform pem -pubkey
会看到如下内容:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi4gx+aC53QDguQ0MWaBe
cRM62P8mEAQSQsp9wrn2Sfa+DQX3pUB2HxpnDYehSvkNCjn3cFrCIFf4r4szopAd
Ay6SNblETXD8td1nzNTRdC/uR4uzUo3JCvz1uYpu9hEfPmmvkC6YehnjIRP13HOh
WzdnW6qdGB15CDlvySjDxli1LX6xbKYXZ6NjC8J5Zb8xkjXOEiiOqpNwwtDlYL/R
1eSCvCJWiOQBGKl9/cjFW38B4us6l2m4L8dW6fzbFwC/lsAIFydvP0X/qdjN3htg
YivJP1MQVc9Nb8Q/Xs5drQcqZeZ5VLK7lzy8MkcjG2dA8XWswRmNIUxyAH7jSpzf
OQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIDQzCCAiugAwIBAgIEcTS6tjANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJj
bjELMAkGA1UECBMCc2gxCzAJBgNVBAcTAnNoMQ0wCwYDVQQKEwRoYW5kMQ0wCwYD
VQQLEwRoYW5kMQswCQYDVQQDEwJldjAeFw0xOTA1MzAwNzAzMTdaFw0xOTA4Mjgw
NzAzMTdaMFIxCzAJBgNVBAYTAmNuMQswCQYDVQQIEwJzaDELMAkGA1UEBxMCc2gx
DTALBgNVBAoTBGhhbmQxDTALBgNVBAsTBGhhbmQxCzAJBgNVBAMTAmV2MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi4gx+aC53QDguQ0MWaBecRM62P8m
EAQSQsp9wrn2Sfa+DQX3pUB2HxpnDYehSvkNCjn3cFrCIFf4r4szopAdAy6SNblE
TXD8td1nzNTRdC/uR4uzUo3JCvz1uYpu9hEfPmmvkC6YehnjIRP13HOhWzdnW6qd
GB15CDlvySjDxli1LX6xbKYXZ6NjC8J5Zb8xkjXOEiiOqpNwwtDlYL/R1eSCvCJW
iOQBGKl9/cjFW38B4us6l2m4L8dW6fzbFwC/lsAIFydvP0X/qdjN3htgYivJP1MQ
Vc9Nb8Q/Xs5drQcqZeZ5VLK7lzy8MkcjG2dA8XWswRmNIUxyAH7jSpzfOQIDAQAB
oyEwHzAdBgNVHQ4EFgQUarJgnmi/5Xk6lGlr0BXjZ1VPxpUwDQYJKoZIhvcNAQEL
BQADggEBABbn5ORbO+xAG1DNVOp8BKsdkoDkB9WdTRwtIvqkSWq55lF0Rhbs8NPM
A/CTUPIfHTEl8ACxTKBORLhtmY2O9wwxTX0iSVUgfPzBAoOldb9FfXhf6OJpgrbT
Qz8rNbXMgvdRppZ7RH6Uqmv74HBoueMKfAKOFqh3kVjnsumWZOvoFIJDcx9z9Uc8
hLoNUBTdvNL3RlpGJBc55vPHVs47RUqOX5iH33w+mnEM4Jg9bB3EGjCBi2yqeHog
y8JpqcJLrgtIugDH+pbDRd4RbYRzfEah0S7oHMTNbUmZBUK+c+reZgFCbHal+yup
gRannJ06ijk8Jcc2Xs20HFQ9FYuoclE=
-----END CERTIFICATE-----
上面内容中的 BEGIN PUBLIC KEY 至 END PUBLIC KEY的部分,就是密钥中的公钥 (公钥可以先粘贴复制出来,后需要用到)
将上一步骤中的"test.keystore"文件放在 maven的resources资源目录下;
token(令牌)存储方式有JWT存储,JDBC存储,内存存储,redis存储及其他存储方式
JWT( json web token)是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范,也是一种token。
JWT由三部分组成:
Header 头部:算法和存储类型信息
Payload 负载:身份信息或者自定义的信息
Signature 签名: RSA签名信息(前文中的密钥,也是通过RSA算法生成的)
使用JWT生成的token大致长这样:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJtc2ctMSI6Iumdk-S7lCIsIm1zZy0yIjoi6Z2T5aWzIiwidXNlcl9uYW1lIjoiZXYiLCJzY29wZSI6WyJyZWFkIl0sImV4cCI6MTU1OTM2NjA1OCwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjVhMDdjYmUyLTEzNDYtNDkwNi1hNDE3LWIxMGYyNWEzM2FjMSIsImNsaWVudF9pZCI6ImNsaWVudEVWIn0.g774D_ITXavxxHdeZ11X_RywCVAMTRrkMpEcCkMMZyk8BYrlHGmTb3ACIeAOWEIyNLXJe06c4vYZaEfrFobXwvFaaH8nZtOUyK_72HziVPfigstOI-ehFivUtL–BPvsERF39gH26yAY_tjWNFhqu8MYo2CvlZMEWGBTdnd5tK8hcq8_w85KjXoggVt-7KXYYnlLVeo-xJOvsEeNpaor0VzFIN61Dfbnj-nB0CaPxsxlT8WC_33AbXvtHnJVqPzQIA3lKRhRaGuRGExZx_BDhL531T2NMlP-NkzRxrausf5fSTegfa-bjrNZh9dg-Pxv3yzRyFIfDxkJ-BJMaQR7KQ
上面这个token,是一个json字符串通过RSA算加密得来的,而这个json字符串是可以通过 https://jwt.io 解析出来的
解析后得到的json字符串大概长这样(下文会讲解这个json字符串是怎么来的):
{"msg-1":"靓仔","msg-2":"靓女","user_name":"ev","scope":["read"],"exp":1559377994,"authorities":["ROLE_USER"],"jti":"dccd734e-5c43-4018-bc62-addefb429c56","client_id":"clientEV"}
上面这个token以“.”分割成三部分:分别对应JWT的三个结构:
Header :eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9 --> 解码 --> 得到算法和存储类型信息
Payload : eyJtc2ctMSI6Iumdk-S7lCIsIm1zZy0yIjoi6Z2T5aWzIiwidXNlcl9uYW1lIjoiZXYiLCJzY29wZSI6WyJyZWFkIl0sImV4cCI6MTU1OTM2NjA1OCwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjVhMDdjYmUyLTEzNDYtNDkwNi1hNDE3LWIxMGYyNWEzM2FjMSIsImNsaWVudF9pZCI6ImNsaWVudEVWIn0 --> 解码 --> 得到上面这样的json字符串
Signature :g774D_ITXavxxHdeZ11X_RywCVAMTRrkMpEcCkMMZyk8BYrlHGmTb3ACIeAOWEIyNLXJe06c4vYZaEfrFobXwvFaaH8nZtOUyK_72HziVPfigstOI-ehFivUtL--BPvsERF39gH26yAY_tjWNFhqu8MYo2CvlZMEWGBTdnd5tK8hcq8_w85KjXoggVt-7KXYYnlLVeo-xJOvsEeNpaor0VzFIN61Dfbnj-nB0CaPxsxlT8WC_33AbXvtHnJVqPzQIA3lKRhRaGuRGExZx_BDhL531T2NMlP-NkzRxrausf5fSTegfa-bjrNZh9dg-Pxv3yzRyFIfDxkJ-BJMaQR7KQ --> 解码 --> 签名算法
2. 自定义配置
2.1 配置TokenStore
核心配置之一,代码块中有注释,这里只需要知道这里怎么配置的,配置起什么作用就行了,具体配置是何时被用到的,不是本章重点,会在本人博客的其它文章中详细说明
@Component
public class TokenStoreConfig {
@Bean("keyProp")
public KeyProperties keyProperties() {
return new KeyProperties();
}
//前文中生成的 test.keystore 文件在resources资源文件夹下的路径
private String location = "test.keystore";
// 生成 test.keystore 文件时候所用的【密钥库口令】
private String secret = "storepass";
// 生成 test.keystore 文件时候所用的【别名】
private String alias = "alias";
// 生成 test.keystore 文件时候所用的【私钥的密码】
private String password = "keypass";
// 生成的秘钥中的 PUBLIC KEY 部分
private String publicKey = "-----BEGIN PUBLIC KEY-----\n" +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsn4FPljPEtJCDmXMEoEK\n" +
"xLCMl5rmd8MUxFVBhwUZGSH71h1Zphaxm9EvSulJQm+FzcldJYTeIDcQYtEl1kbQ\n" +
"4Fmq840Iy3JSLF1Z9WXpddIzB4PLkrJwFYAXZAR351jbYGqUbzWWjJEOGLP6Yvzb\n" +
"BrN6DzEYamoSwGUl8R93h1oRUHR3tVqdbMcjmyllvY7N9Qgk9lAldm6CcgavMqbm\n" +
"USp2X64CgAtdwDixWSO3eCucpXX6ocwaEnUB4XWTXl76OhilZ0WSXXHXOuDZGllj\n" +
"7fhmL0Hyo4bfy3PuQ9BdCJqE54SIELGxrTvapgLqwWhngJlnHSAGqRMkNxCFmwCk\n" +
"/wIDAQAB\n" +
"-----END PUBLIC KEY-----";
/**
* TokenStore是一个接口,他有五个直接子类,分别是:
* JwtTokenStore jwt方式存储
* JdbcTokenStore 数据库方式存储
* InMemoryTokenStore 内存方式存储
* 这里指定了是以JWT方式存储
*/
@Bean
public TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {
//JWT方式存储,需要JWT令牌转换器,下面jwtAccessTokenConverter()方法中自定义了一个JWT令牌转换器
return new