关于 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集成完全版(带测试示例)