jwt token and shiro

openapi可以完全开放访问,也可以使用jwt token进行简单的认证,还可以使用shiro支持更细致的权限管理。

handler.yml配置了security和shiro两个handler:

security:校验请求头Authorization是否符合jwt token规范,是否超时过期等

shiro:校验jwt token里面的user_id用户,是否有权限访问某个接口

获取jwt token有两个接口:

  1. /service/layui/login,adminLayuiHandler,登录时会同时校验验证码和用户密码
    用于前后端分离时的登录页面,登录成功之后即可从响应中获取token值
  2. /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方法检查了当前用户是否有权限访问当前请求路径。

posted @ 2019-08-30 17:14  xlongwei  阅读(728)  评论(1编辑  收藏  举报
xlongwei