JwtTokenPlugin--基于JwtToken的权限认证插件

最近做的项目都是前后端分离的,需要做一种无状态的认证机制,于是用上了jwtToken这种标准,来进行认证,介于shiro里面的东西太多,没空研究,而且需求用不到那么多特性,开发了一款基于JwtToken的一个Jfinal认证插件,以及权限,角色访问控制。

地址:https://git.oschina.net/Danjinsong/JFinal-JwtTokenPlugin.git

使用方法 :

  • 添加插件

  • @Override
    public void configPlugin(Plugins me) {
        me.add(new JwtTokenPlugin(UserService.me));                                /**配置权限拦截插件*/
    }
  • 让Model实现IJwtAble接口

/**
 * 我有故事,你有酒么?
 * JKhaled created by yunqisong@foxmail.com 2017/9/5
 * FOR : 简单实现
 */
public class User implements IJwtAble {

    private String userName;

    private String password;

    private List<String> _roles;

    private List<String> _forces;

    /**
     * 当前用户的角色
     *
     * @return
     */
    @Override
    public List<String> getRoles() {
        // 使用的时候写通过数据库查询返回给插件一个角色集合
        return get_roles();
    }

    /**
     * 当前用户的权限
     *
     * @return
     */
    @Override
    public List<String> getForces() {
        // 使用的时候写通过数据库查询返回给插件一个角色集合
        return get_forces();
    }

    /**
     * 上次修改密码时间
     *
     * @return
     */
    @Override
    public Date getLastModifyPasswordTime() {

        return new Date(System.currentTimeMillis() - 60L * 1000L * 60L * 24);
    }



    public String getUserName() {
        return userName;
    }

    public User setUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public User setPassword(String password) {
        this.password = password;
        return this;
    }

    public User setRoles(List<String> roles) {
        this._roles = roles;
        return this;
    }

    public User setForces(List<String> forces) {
        this._forces = forces;
        return this;
    }

    public List<String> get_roles() {
        return _roles;
    }

    public List<String> get_forces() {
        return _forces;
    }
}
  • 让你的Service实现登录接口

  • /**
     * 我有故事,你有酒么?
     * JKhaled created by yunqisong@foxmail.com 2017/9/5
     * FOR : 简单实现
     */
    public class UserService implements IJwtUserService {
        public static final UserService me = new UserService();
    
        private UserService() {
        }
    
        private static Kv store = Kv.create();
    
        static {
            store.set("admin",
                    new User().setForces(Arrays.asList("登录后台", "管理用户"))
                            .setRoles(Arrays.asList("管理员", "普通用户")).setUserName("admin").setPassword("123456")
            ).set("user",
                    new User().setForces(Arrays.asList("前台登录", "发布文章"))
                            .setRoles(Arrays.asList("普通用户")).setUserName("user").setPassword("123456")
            );
        }
    
        @Override
        public IJwtAble login(String userName, String password) {
            User user = (User) store.get(userName);// 假装登录验证
            if (user != null)
                return user;
            throw new RuntimeException("找不到用户");
        }
    }
  • 通过登录拿Token

  • public void login() {
        User user = getBean(User.class, "");
        String token = JwtKit.getToken(user.getUserName(), user.getPassword());
        renderJson(Ret.by("token", token));
    }

    image.png

  • 验证==

  • 没有登录

  • image.png

  • image.png

  • 通过验证的。

  • 权限验证代码如下


  • /**
     * 我有故事,你有酒么?
     * JKhaled created by yunqisong@foxmail.com 2017/9/5
     * FOR : 简单实现
     */
    public class UserController extends Controller {
    
        public void login() {
            User user = getBean(User.class, "");
            String token = JwtKit.getToken(user.getUserName(), user.getPassword());
            renderJson(Ret.by("token", token));
        }
    
        // 登录认证
        @Before(JwtTokenInterceptor.class)
        public void testLogin() {
            renderJson(Ret.ok());
        }
    
        @Auth(hasRoles = {"管理员"})
        public void testHasRole() {
            renderJson(Ret.ok());
        }
    
        @Auth(hasForces = {"登录后台"})
        public void testHasForce() {
            renderJson(Ret.ok());
        }
    
        @Auth(withRoles = {"管理员", "普通用户"})
        public void testWithRoles() {
            renderJson(Ret.ok());
        }
    
        @Auth(withForces = {"登录后台", "管理用户"})
        public void testWithForces() {
            renderJson(Ret.ok());
        }
    
    }

    注解说明:


  • public @interface Auth {
    
        String[] hasForces() default {};               // 需要的权限 满足一个就可以访问--优先级第三
    
        String[] hasRoles() default {};                // 满足的角色 满足一个就可以访问--优先级第四
    
        String[] withForces() default {};              // 需要的权限 满足全部才可以访问--优先级第一
    
        String[] withRoles()  default {};              // 满足的橘色 满足全部才可以访问--优先级第二
    
    }
Auth注解适用于方法和类,注意:方法上的注解会覆盖掉类上的权限注解。欢迎大家测试,使用

评论区

gszdc

2018-04-27 15:01

lottepie

2018-05-31 17:17

@djs19960601 如何强制使用户的token失效?

弯道加速跑

2018-06-21 08:20

试了一下example的例子,感觉不错,不过JwtKit提供生成Token的方法不能自己传serect吗?

djs19960601

2018-07-05 19:07

@lottepie 我代码中有设置Token的上次修改密码时间,只要你更新数据库中的这个时间久的Token就自动失效

zhangshiqiang

2018-10-30 17:04

@JFinal 非常赞,前端 vue 后端jwt 。

fmpoffice

2023-11-01 16:13

有没有更加简单的,看不懂,为什么要: store.set("admin",
new User().setForces(Arrays.asList("登录后台", "管理用户"))
.setRoles(Arrays.asList("管理员", "普通用户")).setUserName("admin").setPassword("123456")
).set("user",
new User().setForces(Arrays.asList("前台登录", "发布文章"))
.setRoles(Arrays.asList("普通用户")).setUserName("user").setPassword("123456")
);

热门分享

扫码入社