我正在使用javaEE / Wildfly和JAX-RS开发一个应用程序以提供宁静的服务。
我有这种端点:
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addSchool(SchoolDto schoolDto, @HeaderParam("token") String userToken) {
List<String> actionsNeeded = new ArrayList<String>(
Arrays.asList(
"create school"
));
if (authService.userHasActionList(userToken, actionsNeeded) == false )
{
return authService.returnResponse(401);
}
Response addSchoolServiceResponse = schoolResponse.create(schoolDto);
return addSchoolServiceResponse;
}
在Header中使用令牌,我的身份验证服务将检查用户帐户在其授权操作列表中是否具有使用检查点所必需的那些操作。
它正在工作,但是我要在每个检查点上重复一次……我正在寻找一种实现方法:
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Annotation("action 1 needed", "Action 2 needed")
public Response addSchool(SchoolDto schoolDto, @HeaderParam("token") String userToken) {
Response addSchoolServiceResponse = schoolResponse.create(schoolDto);
return addSchoolServiceResponse;
}
一个批注,我可以在该批注中传递一些参数(我的操作以及最重要的是能够拥有用户令牌),这些参数使用过滤器触发或通过任何安全性检查返回401,或者在允许用户执行时让方法执行在那里。
我发现很多基于角色而不是基于此类行动的安全性方面的东西(@Secured等)
有人已经做了类似的事情吗?
答案 0 :(得分:0)
最后我从头开始,一切正常,我的主要问题是访问标头中的令牌并使用注释,现在还可以(我只需要坚持并再尝试一次...)看起来像什么:
@Provider
@Actions
public class AuthorizationFilter implements ContainerRequestFilter {
@EJB
AuthService authService;
@Context
private ResourceInfo resourceInfo;
List<String> actionsNeeded = new ArrayList<String>();
@Override
public void filter(ContainerRequestContext reqContext) throws IOException {
Actions annotations = resourceInfo.getResourceMethod().getAnnotation(Actions.class);
String token;
try {
token = reqContext.getHeaders().get("token").get(0);
for (String annotation : annotations.value()) {
actionsNeeded.add(annotation);
}
if (authService.userHasActionList(token, actionsNeeded) == false )
{
reqContext.abortWith(authService.returnResponse(401));
return;
}
} catch (Exception e) {
System.out.println("Headers 'token' does not exist !");
reqContext.abortWith(authService.returnResponse(400));
}
}
}