Light Security是一款簡潔而不簡單的權限控制框架,基於 jwt ,支持與 Spring Boot 配合使用。
地址
•GitHub[1]
•Gitee[2]
特點
優點
•上手快速
•開箱即用
•輕量級,代碼精簡,不到500行代碼;
•功能實用,市面上安全框架常用能力與套路均已具備:
•支持 RESTful 權限控制
•支持靈活的權限配置(支持基於配置文件 & 代碼,代碼配置方式優先級更高)
•支持基於註解的權限控制
•設計簡單,沒有複雜概念;
•基於權限配置的方式:核心是1個攔截器
•基於註解的權限控制:核心是1個切面
缺點
•功能
•比 Spring Security 弱一點
•和Shiro比功能差不多,但沒有實現複雜的Authentication Strategy(想實現;
•只考慮權限相關問題
•不考慮身份認證(登錄),意味著登錄邏輯得自己玩;
•不考慮防攻擊,意味著網絡攻擊得自己防;
•目前與Spring MVC強綁定,暫不支持WebFlux或其他框架。
依賴
•Spring MVC:用到Spring MVC的攔截器,如果只使用基於註解的權限控制,則無需該部分依賴;
•Spring AOP:如果不用基於註解的權限控制,則無需該部分依賴;
•jwt:你懂的
快速上手
TIPS
快速上手可詳見項目 light-security-example 目錄,內附詳細測試步驟。
基於配置文件的權限配置
1 加依賴:
<dependency>
<groupid>com.itmuch.security/<groupid>
<artifactid>light-security-spring-boot-starter/<artifactid>
<version>1.0.1-RELEASE/<version>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-aop/<artifactid>
/<dependency>
2 寫配置
light-security:
# 權限規則配置:表示用{http-method}方法請求的{path}路徑必須具備什麼{expression}
spec-list:
- http-method: ANY
path: /login
expression: "anon()"
- http-method: ANY
path: /user
expression: "hasAnyRoles('user','admin')"
- http-method: GET
path: /error
expression: "anon()"
- http-method: ANY
path: /**
expression: "hasLogin()"
jwt:
# jwt sign算法
algorithm: hs512
# jwt secret
secret: http-security-secret-modify-mehttp-security-secret-modify
# jwt 有效時間
expiration-in-second: 1209600
3 寫代碼:
@RequestMapping
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final UserOperator userOperator;
private final JwtOperator operator;
/**
* 演示如何獲取當前登錄用戶信息
* - 該路徑需要具備user或admin權限才可訪問,詳見application.yml
*
* @return 用戶信息
*/
@GetMapping("/user")
public User user() {
return userOperator.getUser();
}
/**
* 演示基於註解的權限控制
*
* @return 如果有權限返回 親,你同時有user、admin角色..
*/
@GetMapping("/annotation-test")
@PreAuthorize("hasAllRoles('user','admin')")
public String annotationTest() {
return "親,你同時有user、admin角色..";
}
/**
* 模擬登錄,頒發token
*
* @return token字符串
*/
@GetMapping("/login")
public String loginReturnToken() {
User user = User.builder()
.id(1)
.username("張三")
.roles(Arrays.asList("user", "admin"))
.build();
return operator.generateToken(user);
}
}
基於代碼的權限配置
@Configuration
public class LightSecurityConfigurtion {
@Bean
public SpecRegistry specRegistry() {
return new SpecRegistry()
.add(HttpMethod.GET, "/user", "hasAnyRoles('user')")
.add(HttpMethod.ANY, "/**", "hasLogin()");
}
}
此時,application.yml 中的如下配置可刪除,因為代碼配置方式優先級更高,配置文件方式將會失效。
light-security:
# 權限規則配置:表示用{http-method}方法請求的{path}路徑必須具備什麼{expression}
spec-list:
- http-method: ANY
path: /login
expression: "anon()"
- http-method: ANY
path: /user
expression: "hasAnyRoles('user','admin')"
- http-method: GET
path: /error
expression: "anon()"
- http-method: ANY
path: /**
expression: "hasLogin()"
擴展點
類作用com.itmuch.lightsecurity.jwt.UserOperator提供用戶相關操作,例如解析token獲得用戶信息等。com.itmuch.lightsecurity.el.PreAuthorizeExpressionRoot提供了表達式,例如hasAnyRoles('user') 等,如需新能力,只要寫新方法即可com.itmuch.lightsecurity.annotation.support.PreAuthorizeAspect為註解 @PreAuthorize("hasAllRoles('user','admin')")提供支持
常見問題
為什麼要再造個輪子?
老是有人問我諸如"微服務安全怎麼管理?"、"Spring Securityxxxx問題你遇到過嗎?"、"能寫個Spring Cloud Security的系列教程嗎?"、"Shiroxxxx問題你遇到過嗎?"
煩不勝煩,初期積極回覆;後來消極回覆;再後來懶得回覆。
分析一下,發現主要原因還是Spring Security、Shiro學習曲線較高,特別是Spring Security。所以就想寫個輕量的框架,能夠快速解決主要矛盾——足夠簡單、能實現權限控制。
為什麼不實現一個通用的權限解決方案?
有考慮實現一個通用權限框架,但那樣會增加挺多代碼,而且要添加挺多適配邏輯(例如適配Spring MVC、WebFlux等)。
個人認為這在現階段去實現還不合適,個人不太喜歡畫餅。既然"通用性"不是目前最主要的矛盾,高效解決問題相對更加重要。那何必花精力去實現通用性?設計上支持往"通用性"遷移即可。
未來如果有需求,我會做一個通用版本,並且低版本也可無痛、平滑地遷移。
為什麼不考慮身份認證(登錄)?
目前市面上大多權限框架都考慮了"身份認證(登錄)" + "權限管理" 。然而登錄操作在現在這個時代,是一個"五花八門"的操作。例如:
•手機號 + 驗證碼登錄
•掃二維碼登錄
•賬號密碼登錄
•證書登錄
往往還需還同時支持多種登錄方式。這挺難去抽象出通用模式,併為典型的登錄方式提供支持。
索性不考慮了——把登錄問題留給使用者自己。用戶可根據業務需求實現登錄邏輯,並頒發Token,後面的事情就交給 Light Security ,讓它給你搞定。這樣相對更加靈活,更重要的是——你也不再需要去學習用框架應該怎麼登錄。
TODO
•支持對稱加密/非對稱加密配置化;
•支持 JWE
•補充單元測試
•將 light-security 與 light-security-spring-boot 分離,否則既是框架,又是Starter感覺有點怪。
乾貨分享
最近將個人學習筆記整理成冊,使用PDF分享。關注我,回覆如下代碼,即可獲得百度盤地址,無套路領取!
•001:《Java併發與高併發解決方案》學習筆記;
•002:《深入JVM內核——原理、診斷與優化》學習筆記;
•003:《Java面試寶典》
•004:《Docker開源書》
•005:《Kubernetes開源書》
•006:《DDD速成(領域驅動設計速成)》
References
[1] GitHub: https://github.com/eacdy/light-security
[2] Gitee: https://gitee.com/itmuch/light-security
閱讀更多 IT牧場 的文章