- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将 Jersey 的 DeclarativeLinking 特性与其 RolesAllowed 特性结合起来。
我能够成功地将链接注入(inject)到响应中,但该注入(inject)并未关注该端点的 RolesAllowed 注释。
例如,假设有两个用户。称他们为管理员和用户。两者都可以访问 GET 资源,但只有管理员可以访问 DELETE。
如果资源方法受@RolesAllowed 保护,那么我希望没有该角色的用户不会注入(inject)该端点。情况似乎并非如此。
我按照找到的例子 here .
以下是我正在处理的项目的简化版本,用于说明目的。
对于管理员,我希望有以下 json,
{
"id" : 1
"value" : "someValue",
"links" : [
{
"href": "http://localhost/context/model/1",
"rel": "self",
"type": "GET"
},
{
"href": "http://localhost/context/model/1",
"rel": "delete",
"type": "DELETE"
},
},
}
这正是我得到的。不幸的是,对于没有访问该端点所需的正确角色的用户,我也会收到此响应。用户仍将获得删除端点的链接,但由于 RolesAllowed,该用户将收到 403。
型号
public class Model {
private int id;
private String value;
//constructor/getters/setters
模型表示
public class ModelRep {
@XmlPath(".") //Allows me to flatten json so that links and document are at the same level
private Model model;
@InjectLinks({
@InjectLink(
rel = "self",
type = "GET",
resource = ModelResource.class,
method = "getModel",
bindings = @Binding(name = "id", value = "${instance.id}"),
style = Style.ABSOLUTE
),
@InjectLink(
rel = "delete",
type = "DELETE",
resource = ModelResource.class,
method = "deleteModel",
bindings = @Binding(name = "id", value = "${instance.id}"),
style = Style.ABSOLUTE
)
})
@XmlJavaTypeAdapter(LinkAdapter.class)
private List<Link> links;
//constructor/getters/setters
模型资源
@Path("/model")
@Produces(MediaType.APPLICATION_JSON)
public class ModelResource {
@GET
@Path("/{id}")
public Response getModel(@PathParam("id") int id) {
Model m = dao.get(id);
ModelRep mr = new modelRep(m);
GenericEntity<ModelRep> ent = new GenericEntity<ModelRep>(mr) {};
return Response.status(Status.OK).entity(ent);
}
@DELETE
@Path("/{id}")
@RolesAllowed(Roles.ADMIN)
public Response deleteModel(@PathParam("id") int id) {
dao.delete(id);
return Response.status(Status.NO_CONTENT);
}
问题有什么方法可以基于 RolesAllowed 实现条件声明链接吗?
我知道 InjectLink 注释存在条件子句,但允许的值为实例 (ModelRep)、实体(我认为是响应对象?)、资源 (ModelResource)。
我不知道有什么方法可以使用这些来检查权限。
非常感谢任何建议
最佳答案
所以我最终找到了一个有点老套但效果很好的解决方案。
每个资源扩展一个基础资源类
@Path("/model")
@Produces(MediaType.APPLICATION_JSON)
public class ModelResource extends BaseResource {
BaseResource 定义了一个公共(public)方法,该方法返回当前资源的特定方法是否受 RolesAllowed 注释限制。
public abstract class BaseResource {
@Context
private SecurityContext security;
public boolean isMethodRoleProtected(String sMethod) {
Method[] methods = this.getClass().getDeclaredMethods();
for (Method m : methods) {
if (m.getName().equalsIgnoreCase(sMethod)) {
Annotation[] annotations = m.getAnnotations();
for (Annotation a : annotations) {
if (a instanceof RolesAllowed) {
String[] roles = ((RolesAllowed) a).value;
return userHasRole(roles);
}
}
}
}
return false;
}
protected boolean userHasRole(String... roles) {
for (String role : roles) {
if (security.isUserInRole(role)) {
return true;
}
}
return false;
}
}
最后,InjectLink 注释将如下所示,
@InjectLink(
rel = "self",
type = "GET",
resource = SomeResource.class,
method = "someMethod",
bindings = @Binding(name = "id", value = "${instance.id}"),
style = Style.ABSOLUTE,
condition = "${resource.isMethodRoleProtected(someMethod)}"
),
'resource' 是扩展 BaseResource 的当前端点类的实例。因此,仅当当前用户具有该方法的 RolesAllowed 注释中存在的角色时,才会注入(inject)此链接。
此解决方案需要实现 SecurityContext。
如果其他人有更好/更清洁的解决方案或改进我找到的解决方案的方法,我仍然很乐意听到并会相应地调整接受的答案。干杯
关于java - 使用 RolesAllowed 的 Jersey 声明链接权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41697615/
我正在开发一个项目,该项目具有用 @RolesAllowed 注释的服务。我知道这个注释定义了可以访问该方法的角色。但我不确定这些角色是在哪里定义的以及如何为不同的角色添加用户。我使用 weblogi
我必须将方法的访问限制为仅具有特定角色的用户。IdentityManager 已正确构建。 我有这个 Controller 类。 @Named @RequestScoped @LoggedIn pub
我目前正在Tomcat 7中使用Jersey 2.5.1创建后端服务器。为了安全起见,我使用了@RolesAllowed,@PermitAll等批注,并且创建了自定义的ContainerRequest
在 Spring Boot 应用程序中,仅使用注释,我想实现安全性 我已将 @EnableGlobalMethodSecurity(jsr360Enabled=true) 添加到配置类。该类还有一个
我的数据库中有两个表格。用户和 user_role。 CREATE TABLE `user` ( `username` varchar(50) NOT NULL, `password` var
TLDR我开发的Java Web应用程序需要在REST服务上实现用户区分。我知道有一些注释(@RolesAllowed、@PermitAll、@DenyAll)可以描述哪个角色可以使用该服务。我的问题
我正在使用 keycloak,我已经创建了一个 dropwizard 服务,我想开始在其中执行角色。 我试过使用@RolesAllowd("user") 注释,但它总是返回 403。 我也试过@Per
我有一个名为和 SessionScoped 的 JSF Controller ,如下所示 import javax.inject.Named; import javax.enterprise.cont
我在设置安全 REST 服务时遇到一些问题。我想创建一个简单的登录/注销服务并使用它。 我正在关注本教程。我跳过了登录表单的部分,并将用户名和密码硬编码到服务中。 (登录()) http://www.
我正在使用 JAX-RS 和 Jersey 实现。我正在尝试使用 Tomcat 6 使用 BASIC 身份验证来验证我的服务。 这是代码: @Path("/authenticate") @RolesA
我正在使用 Spring @RolesAllowed 来保护我的 API(方法),但我想更改未经授权的用户调用方法时发生的情况。当前的行为是 Spring 抛出 HTTP 403 错误。这很棒,但我只
我正在使用 App Engine 和 Jersey 构建应用程序。我想使用允许在请求中创建过滤器的注释 @RolesAllowed(Role_user)。 问题是我们需要配置类SecurityCont
我要问的问题有点棘手,我还没有找到任何答案。也许是因为我在寻找错误的东西。但我希望你能在这方面帮助我。 我用了following tutorial实现使用 token 而不是基本用户/密码身份验证的自
我希望向客户端提供休息 API 调用(通过普通 Jersey ,而不是 spring),以根据他们在 header 中发送的 JWT 返回特定用户允许的所有端点的列表。我在 stackoverflow
我有一个基本的 SpringBoot 应用程序。使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎,并将其打包为可执行的 JAR 文件。 @Configur
我在我的应用程序中使用角色授权,如下所示, **@RolesAllowed("Admin")** public class ExampleResource { // @GET @Produce
我想将 Jersey 的 DeclarativeLinking 特性与其 RolesAllowed 特性结合起来。 我能够成功地将链接注入(inject)到响应中,但该注入(inject)并未关注该端
我有一个简单的 jersey 2.4 资源: @RolesAllowed("admin") public List list(){} 我还有一个设置自定义安全上下文的 ContainerRequest
我正在尝试根据我通过 Jersey/JAX-RS 公开的资源的角色设置身份验证。此资源存在于 Glassfish 实例中,其中基于角色的身份验证(具体而言,通过 @RolesAllowed)当前正在按
我们正在通过 postman 休息客户端测试在 Jersey 开发的 REST 网络服务。它是一个 POST 方法,用 @RolesAllowed 注释。该方法完整注解如下: @POST @Path(
我是一名优秀的程序员,十分优秀!