关于 RESTful 和 Shiro 集成的示例

Posted

技术标签:

【中文标题】关于 RESTful 和 Shiro 集成的示例【英文标题】:Sample about RESTful and Shiro Integration 【发布时间】:2013-08-06 04:26:42 【问题描述】:

我正在开发一个使用 RESTful 作为 Web 服务的 Java Web 应用程序。现在我想应用 Apache Shiro 来保护我的应用程序。其机制是:用户登录成功后,会向客户端返回一个令牌(由用户名、密码和登录时间组合而成)。然后每个单独的 REST 请求都将附加此令牌以在服务器上进行身份验证(无需授权)。但是现在我不知道如何配置来接受这个。 顺便说一句,你能给我一些关于 Shiro 和 RESTful 集成的示例吗?谢谢

【问题讨论】:

【参考方案1】:

如果REST应用和Java web应用是同一个Webapp,那么只需要检查subject.isAuthenticated()即可。使用没有密码或用户名的会话 cookie(传递密码不是一个好主意,因为它可能会被盗)。

如果两个部分都在同一个 Web 应用程序中,则默认情况下会出现这种行为。

在您的 REST 方法中,您会有类似的内容:

Subject subject = SecurityUtils.getSubject();
if(subject == null || !subject.isAuthenticated()) 
     return 401; // Not Authorized

希望对您有所帮助。

【讨论】:

谢谢@Stephen。是的,Java web 应用程序和 REST 共享同一个 webapp。该会话 cookie 上的服务器进程上的身份验证代码。但是我的 REST 应用程序是一个移动应用程序,所以我不确定是否可以在其上使用会话 cookie。我更喜欢使用令牌(从用户名和密码生成)并将其附加到每个请求中。结果,我需要重新实现身份验证步骤,并且不能重用旧的。无论如何,您的提示可能对我有很大帮助,我会尝试一下。【参考方案2】:

除了上述响应之外,您还可以从您的 REST 服务器发回一个令牌(会话 ID),发布成功登录。然后,您的 ios/android 应用程序将需要存储此信息,并将其与它发出的每个 REST 请求一起发送。以下是登录后 REST 响应的示例:

session-start-timestamp: 1394683755389,
session-timeout: 1800000,
session-id: "068C8E0E289788A7ABC5FE47B2CC0D28"

session-id 将由您的 REST 服务器维护,每次带有此 id 的新请求进入时,都会重置其 TTL。

在浏览器上,此 ID 会自动发送。对于您的情况,您可能希望在每个 HTTP 请求中显式发送它(这就是 REST 请求)

希望对你有帮助

【讨论】:

以上是关于关于 RESTful 和 Shiro 集成的示例的主要内容,如果未能解决你的问题,请参考以下文章

从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统03创建RESTful API,并统一处理返回值

Springboot+JWT+Shiro集成完全版(带测试示例)

Springboot+JWT+Shiro集成完全版(带测试示例)

SpringBoot 集成Shiro--官网

MP实战系列之集成Shiro

Spring boot 入门:集成 Shiro 实现登陆认证和权限管理