·
新项目由于用户权限复杂度上升,团队成员沿用前期鉴权代码时,出现较多的重复劳动且容易出错。
本着写的越少、出错越少的原则,调研了一圈Play框架适用的鉴权库,选择了 Silhouette 进行整合。
根据官方文档和众多样例工程摸索了几天,终于完成了适配代码的编写和测试。后期,团队成员可以用非常简洁的胶水代码完成各个接口的授权和访问控制了。
认证(authentication)和授权(authorization)的区别
你要登机,你需要出示你的 passport 和 ticket,passport 是为了证明你张三确实是你张三,这就是 authentication;而机票是为了证明你张三确实买了票可以上飞机,这就是 authorization。
在 computer science 领域再举个例子:
你要登陆论坛,输入用户名张三,密码1234,密码正确,证明你张三确实是张三,这就是 authentication;再一check用户张三是个版主,所以有权限加精删别人帖,这就是 authorization。
上述对认证和授权的解释摘自左一
参考资料
- 样例工程:play-silhouette-rest-mongo Play Framework 2.6 with Silhouette 5.0(比较新,有很大参考价值)(JWTAuthenticator)
- 样例工程:silhouette-play-react-seed SPA,React/Redux,Play(与上面样例对比着参考,有一定参考价值)(CookieAuthenticator)
- 教程:Play authentication and authorization with Silhouette + rate limiting 接口分权限(Authorization)例子很有启发性
- 教程:https://www.silhouette.rocks/docs/authorization 对比上一条教程,体会分权的多种形式
- https://www.silhouette.rocks/docs/authenticator
- https://www.silhouette.rocks/docs/config-authenticators#bearertokenauthenticator
- https://www.silhouette.rocks/docs/providers
- Controller层的写法:https://www.silhouette.rocks/docs/endpoints
- 环境(默认,社交网络,手机号登录):https://www.silhouette.rocks/docs/environment
- 访问频率控制:https://www.silhouette.rocks/docs/rate-limiting https://github.com/sief/play-guard
适配代码模块
我们采用了BearerTokenAuthenticator的认证机制,在用户登录之后返回具有时效性的Token给前端。前端会携带Token来访问后续的受限资源,以此达到资源的访问控制。
- SilhouetteModule 模块注册,依赖注入
- Privileges 权限模块( extends Authorization[User, BearerTokenAuthenticator] )
- AuthenticatorRepositoryImpl Token认证模块( extends AuthenticatorRepository[BearerTokenAuthenticator] )
- PasswordInfoDAOImpl 密码口令模块( extends DelegableAuthInfoDAO[PasswordInfo] )
- PrivilegeDaoImpl 权限模块和数据库权限表的关联适配模块