【问题标题】:Is there a way to conditionally apply annotations?有没有办法有条件地应用注释?
【发布时间】:2016-08-25 04:49:50
【问题描述】:

在我的 java-play 应用程序中,我的控制器中有注释 @RequiresAuthentication(clientName = "CasClient")

我只想在我的生产环境中对用户进行身份验证。

如何有条件地应用注释?

如果我进行身份验证的方式是错误的,那么仅在 java play 应用程序中的生产环境中进行 CAS 身份验证的传统方式是什么?

【问题讨论】:

  • 在得到响应后尝试使用条件或在检查任何您想要的内容后使用注释!我在这里看不到问题
  • @AhmadAlsanie 如果您能提供一个示例说明我在执行检查后如何使用注释,那么这正是我正在寻找的答案。
  • 您正在使用 play-pac4j 进行身份验证,对吗?还是 RequiresAuthentication 你的自定义注解?
  • @Tijkijiki 是的 pac4j

标签: java annotations cas playframework-2.3


【解决方案1】:

您可以实现 authenticators 来对用户进行身份验证。你能在你的身份验证器实现中编写你的身份验证逻辑吗?

Play 已经带有一个内置的 authenticator 操作,我们将对其进行扩展以添加我们的逻辑。我们将此身份验证器称为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 地址,我们在用户登录时在会话中的 email 属性中设置。如果此方法返回一个值,则身份验证器认为用户已登录,并让请求继续进行。但是,如果该方法返回 null,则身份验证器将阻止该请求,而是调用 onUnathorized,我们已实现该方法以重定向到我们的登录屏幕。 您可以为用户验证用户实现自己的业务逻辑。

现在让我们使用这个验证器。在 Application.java 中,将带有我们身份验证器的 @Security.Authenticated 注释添加到 index 方法中:

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())
         )); 
     }
}

Refs:Play Implementing Authenticator Example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多