apache http可以访问https没权限_Shiro配合JWT实现权限管理教程

使用框架的目的是帮助我们简化流程和步骤,提高程序的扩展性。当然我们使用shiro的目的也不例外。

笔者主要是想对系统的API实现不同粒度的权限校验。看了很多shiro的教程似乎都在列架构,对如何使用说得不太清楚。

最后我从github上fork下来几个demo,结合改造了一下。

本文旨在为入门的朋友介绍,怎么使用shiro来实现前后端分离的http接口权限校验。不打算讲如何配置。具体可以看GitHub上的源码。

认证 授权 凭证

在使用之前必须要明白我们系统的权限控制流程是怎样的,这样才能更好地知道我们需要框架来帮自己完成什么事。

整个流程归根到底这类流程要解决两个问题,我是谁?我能做什么?

我是谁对应的动作是authentication(认证)校验用户的身份。

而能做什么对应的是authorization(授权)根据用户的身份来判断哪些资源是他允许访问的。

由于http是个无状态的协议,实现认证和授权的基础是需要一种媒介(credentials),这个凭据需要标记访问者的身份。关于token的发布和认证的方式非常多,本文不打算做展开。

这次教程使用的是JWT token。有兴趣了解这个认证方式的可以访问官网了解如歌使用。

JWT.IO​jwt.io

为什么选择shiro

因为这次的项目是Spring boot项目,使用Spring security似乎更加合情合理。但是他的教程和配置我看了两天以后是在难懂(不是

最后我转向了shiro这个更加轻量级的框架,简单的配置和良好的拔插性,所以就你了。

使用介绍

这里只要是实现了servlet接口的容器都是这流程,shiro配置的过滤器将会被优先执行。

只有当过滤器放行了以后才会执行余下的filterChain,就是我们本来的程序流程。

过滤器的选择和实现

先看一下shiro为什么提供了哪些过滤器 ,有些是我们可以直接使用的,而有些我们可以继承过来改写一些逻辑点。

Apache Shiro | Simple. Java. Security.​shiro.apache.org

我们可以发现已经有对应的类能完成我们的工程了,http的授权流程shiro已经帮我们抽象BasicHttpAuthenticationFilter这个类。

过滤器的base class AccessControlFilter

只有当上面的perHandler成功以后程序才会向下执行。

perHandler成功有两个条件

  1. 先检查当前的访问是不是被允许 isAccessAllowed 这个方法可以被我们重写,不重写的话会默认检查当前的subject是否获取了授权
  2. 如果这个方法没有通过的话,会继续执行onAccessDenied 来处理那些没有访问被拒绝的请求。这个方法会判断我们的请求是否是登陆请求,是的话就会执行对应的登陆方法。

上面是BasicHttpAuthenticationFilter对应实现,如果判断是登陆的话,会执行登陆操作。 从http协议的请求头Authorization中找到账号密码进行登入。然后再重定向到登陆成功url。这个不符合需求,所以我们重写一下这个方法

对于登陆的请求直接放行生成JWT token给调用方。否则我们要校验JWT token是否合法。

realm实现

上面我调用了subjec的login方法来校验token,校验的规则依赖于我们的realm如何实现,代码如下。这个地方结束了完成了我们的认证部分。

在我们需要权限校验的地方会执行另外一个方法,实现的代码如下。我们可以配合shiro提供的注解或者subjct的校验方法,实现我们想要的不同粒度的权限控制。

权限配置shiro团队也给我提供了通配符匹配和字符串匹配两种功能,通配符权限使用方法可以看下面的介绍。我们配置权限的应该遵守一个原则,配置时可模糊,校验必须准确。

通配符权限配置教程

https://shiro.apache.org/static/1.2.3/apidocs/org/apache/shiro/authz/permission/WildcardPermission.html​shiro.apache.org

最后,由于这几天在家是在无聊。Apache shiro的核心源码我读了一半,确实是非常优质的工程,无论是函数名还是流程的抽象,和类的结构都非常好。我们从中很容易就能扩展我们需要的功能。只能说拜读了。

最后附上项目源码 https://github.com/JR--Chen/shiro-jwt-rabc-example

使用框架的目的是帮助我们简化流程和步骤,提高程序的扩展性。当然我们使用shiro的目的也不例外。 笔者主要是想对系统的API实现不同粒度的权限校验。看了很多shiro的教程似乎都在列架构,对如何使用说得不太清楚。 最后我从github上fork下来几个demo,结合改造了一下。 本文旨在为入门的朋友介绍,怎么使用shiro来实现前后端分离的http接口权限校验。不打算讲如何配置。具体可以看GitHub上的源码。 认证 授权 凭证 在使用之前必须要明白我们系统的权限控制流程是怎样的,这样才能更好地知道我们需要框架来帮自己完成什么事。 整个流程归根到底这类流程要解决两个问题,我是谁?我能做什么? 我是谁对应的动作是authentication(认证)校验用户的身份。 而能做什么对应的是authorization(授权)根据用户的身份来判断哪些资源是他允许访问的。 由于http是个无状态的协议,实现认证和授权的基础是需要一种媒介(credentials),这个凭据需要标记访问者的身份。关于token的发布和认证的方式非常多,本文不打算做展开。 这次教程使用的是JWT token。有兴趣了解这个认证方式的可以访问官网了解如歌使用。 JWT.IOjwt.io 为什么选择shiro 因为这次的项目是Spring boot项目,使用Spring security似乎更加合情合理。但是他的教程和配置我看了两天以后是在难懂(不是 最后我转向了shiro这个更加轻量级的框架,简单的配置和良好的拔插性,所以就你了。 使用介绍 这里只要是实现了servlet接口的容器都是这流程,shiro配置的过滤器将会被优先执行。 只有当过滤器放行了以后才会执行余下的filterChain,就是我们本来的程序流程。 过滤器的选择和实现 先看一下shiro为什么提供了哪些过滤器 ,有些是我们可以直接使用的,而有些我们可以继承过来改写一些逻辑点。 Apache Shiro | Simple. Java. Security.shiro.apache.org 我们可以发现已经有对应的类能完成我们的工程了,http的授权流程shiro已经帮我们抽象BasicHttpAuthenticationFilter这个类。 过滤器的base class AccessControlFilter 只有当上面的perHandler成功以后程序才会向下执行。 perHandler成功有两个条件 先检查当前的访问是不是被允许 isAccessAllowed 这个方法可以被我们重写,不重写的话会默认检查当前的subject是否获取了授权 如果这个方法没有通过的话,会继续执行onAccessDenied 来处理那些没有访问被拒绝的请求。这个方法会判断我们的请求是否是登陆请求,是的话就会执行对应的登陆方法。 上面是BasicHttpAuthenticationFilter对应实现,如果判断是登陆的话,会执行登陆操作。 从http协议的请求头Authorization中找到账号密码进行登入。然后再重定向到登陆成功url。这个不符合需求,所以我们重写一下这个方法 对于登陆的请求直接放行生成JWT token给调用方。否则我们要校验JWT token是否合法。 realm实现 上面我调用了subjec的login方法来校验token,校验的规则依赖于我们的realm如何实现,代码如下。这个地方结束了完成了我们的认证部分。 在我们需要权限校验的地方会执行另外一个方法,实现的代码如下。我们可以配合shiro提供的注解或者subjct的校验方法,实现我们想要的不同粒度的权限控制。 权限配置shiro团队也给我提供了通配符匹配和字符串匹配两种功能,通配符权限使用方法可以看下面的介绍。我们配置权限的应该遵守一个原则,配置时可模糊,校验必须准确。 通配符权限配置教程 https://shiro.apache.org/static/1.2.3/apidocs/org/apache/shiro/authz/permission/WildcardPermission.htmlshiro.apache.org 最后,由于这几天在家是在无聊。Apache shiro的核心源码我读了一半,确实是非常优质的工程,无论是函数名还是流程的抽象,和类的结构都非常好。我们从中很容易就能扩展我们需要的功能。只能说拜读了。 最后附上项目源码 https://github.com/JR--Chen/shiro-jwt-rabc-example
经验分享 程序员 微信小程序 职场和发展