有没有一种方法可以有条件地应用注释?

12
在我的java-play应用程序中,我在控制器中使用了注释@RequiresAuthentication(clientName = "CasClient")
我只想在生产环境中对用户进行身份验证。
如何按条件应用注释?
如果我的身份验证方法不正确,那么在java play应用程序中仅在生产环境中执行CAS身份验证的常规方法是什么?

那个怎么样?https://www.playframework.com/documentation/2.1.1/JavaGuide4 - T_01
尝试在获得响应后使用条件,或者在检查所需内容后使用注释!我看不出问题在哪里。 - Ahmad Sanie
@AhmadAlsanie,如果您能提供一个示例,说明我在执行检查后如何使用注释,那就正是我所寻找的答案。 - Blinky
1
你正在使用play-pac4j进行认证,对吗?还是RequiresAuthentication是你自定义的注释? - Tijkijiki
@Tijkijiki 是的,pac4j。 - Blinky
1个回答

2

您可以实现认证器来验证用户身份。您可以在认证器实现中编写您的身份验证逻辑。

Play已经内置了一个认证器操作,我们将扩展该操作以添加我们的逻辑。我们将称此认证器为Secured

import play.*;
import play.mvc.*;
import play.mvc.Http.*;

import models.*;

public class Secured extends Security.Authenticator {

    @Override
    public String getUsername(Context ctx) {
        return ctx.session().get("email");
    }

    @Override
    public Result onUnauthorized(Context ctx) {
        return redirect(routes.Application.login());
    }
}

我们在这里实现了两种方法。getUsername 用于获取当前登录用户的用户名。在我们的情况下,这是在用户登录时在会话中设置的 email 属性。如果此方法返回值,则认证器将认为用户已登录,并允许请求继续。但是,如果该方法返回 null,则认证器将阻止请求并调用 onUnauthorized 方法,我们已实现重定向到我们的登录屏幕。
您可以实现自己的用户验证业务逻辑。
现在让我们使用这个认证器。在 Application.java 中,在 index 方法上添加 @Security.Authenticated 注解与我们的认证器一起使用。
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {

     @Security.Authenticated(Secured.class)
      public static Result index() {
        return ok(index.render(
         Project.findInvolving(request().username()), 
           Task.findTodoInvolving(request().username()),
            User.find.byId(request().username())
         )); 
     }
}

引用:Play实现认证器示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接