Я пытался понять, как использовать аннотацию @RunAs из java документов , но я не понял, как ее использовать. Кто-нибудь может объяснить, пожалуйста?
Что я понимаю, в некоторых случаях, если аутентифицированный пользователь с другой ролью хочет получить доступ к методу ejb, доступ к которому разрешен только пользователям с определенными ролями, тогда вызывающий ejb может комментировать себя для запуска в качестве ожидаемой роли и может обращаться к методу ejb.
Итак, я написал приведенный ниже код, но мое понимание неверно.
JAX-RS Класс:
package com.jee.beginner.rest;
import java.security.Principal;
import javax.inject.Inject;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.groups.ConvertGroup;
import javax.validation.groups.Default;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import com.jee.beginner.custom.validation.Create;
import com.jee.beginner.custom.validation.Update;
import com.jee.beginner.domain.Student;
import com.jee.beginner.service.StudentService;
import com.jee.beginner.service.proxy.StudentServiceProxy;
@Path("student")
public class StudentResource {
@Inject
private Principal principal;
@Inject
private StudentService studentService;
@Inject
private StudentServiceProxy studentServiceProxy;
@GET
@Path("details/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Student getDetails(@PathParam("id") @Min(value = 2, message = "ID cannot be less than 2") int id,
@QueryParam("id") int qid, @Context UriInfo uriInfo) {
return studentServiceProxy.getDetails(id);
}
@POST
@Path("new")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Student addStudent(@Valid @ConvertGroup(from = Default.class, to = Create.class) final Student student) {
return studentService.addStudent(student);
}
@POST
@Path("update")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Student updateStudent(@Valid @ConvertGroup(from = Default.class, to = Update.class) final Student student) {
return student;
}
}
Класс прокси. Этот класс помечен как @RunAs ("admin")
package com.jee.beginner.service.proxy;
import javax.annotation.security.RunAs;
import javax.ejb.Stateless;
import javax.inject.Inject;
import com.jee.beginner.domain.Student;
import com.jee.beginner.service.StudentService;
@RunAs("admin")
@Stateless
public class StudentServiceProxy {
@Inject
private StudentService studentService;
public Student getDetails(int id) {
return studentService.getDetails(id);
}
}
Класс обслуживания:
package com.jee.beginner.service;
import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import com.jee.beginner.domain.Student;
@Stateless
public class StudentService {
@Resource
private EJBContext context;
@RolesAllowed({ "admin", "guest" })
public Student addStudent(final Student student) {
System.out.println(context.isCallerInRole("admin"));
return student;
}
@RolesAllowed({ "admin" })
public Student getDetails(int id) {
Student student = new Student();
student.setId(id);
student.setName("noname");
return student;
}
}
Я создал область и добавил двух пользователей
UserA - admin , UserB - guest
Без аннотации RunAs, UserA смог получить доступ к методу, как и ожидалось, а UserB не смог получить доступ к методу, как и ожидалось.
Как только я добавил аннотацию RunAs оба пользователя не смогли получить доступ к методу getDetails.
То, что я думал, что UserB сможет получить доступ к методу сейчас, потому что прокси-сервер аннотирован администратором RunAs, и я думал, что StudentService будет рассматривать пользователя как роль администратора. Но в действительности то, что произошло, было связано с тем, что UserA также не смог получить доступ к методу.
Может кто-нибудь объяснить, пожалуйста, значение аннотации RunAs?