jwt token and shiro
openapi可以完全开放访问,也可以使用jwt token进行简单的认证,还可以使用shiro支持更细致的权限管理。
handler.yml配置了security和shiro两个handler:
security:校验请求头Authorization是否符合jwt token规范,是否超时过期等
shiro:校验jwt token里面的user_id用户,是否有权限访问某个接口
获取jwt token有两个接口:
- /service/layui/login,admin,LayuiHandler,登录时会同时校验验证码和用户密码
用于前后端分离时的登录页面,登录成功之后即可从响应中获取token值 - /openapi/token,swagger,Example有一个长期可用的token值(生产上已更换私钥所以此token无效)
配置了JwtMockHandler响应token,仅用于测试
生产时禁用示例token:生成私有的server.keystore、server.crt即可,可以参考sh start.sh keystore命令
shiro授权收到了shiro.ini配置的启发,由于这里使用了无状态、无会话的认证,因此登录时没有使用shiro,也没有引入RBAC相关表结构
mvn test –Dtest=com.xlongwei.light4j.RedisTest#shiro,提供了示例的权限控制:
shiro.users={admin=123456,admin, steve=123456,admin}
shiro.roles={admin=*:*:*}
shiro.urls={/openapi/upload*/**=roles["admin,user",admin],perms[openapi:upload:*,"service:upload:upload,delete"]}
使用了redis的map数据结构,支持用户admin、steve登录,支持灵活配置用户、角色、权限并即时生效(比shiro.ini更灵活方便)
roles["admin,user",admin]:(admin and user) or admin,用户admin不满足admin and user,但是满足or admin,因此鉴权通过
perms[openapi:upload:*,"service:upload:upload,delete"]:用户admin为超级权限*:*:*,后面这个权限需要双引号避免被逗号分隔造成歧义
MyJwtShiroHandler直接使用token登录shiro,自定义了JwtAuthenticationToken、JwtAuthenticationRealm,通过token获得userId,再获取roles、perms
checkUrls方法检查了当前用户是否有权限访问当前请求路径。