Light Security 1.0.1發佈

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


分享到:


相關文章: