java - 有没有办法有条件地应用注释?

标签 java annotations cas playframework-2.3

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

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

如何有条件地应用注释?

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

最佳答案

您可以实现authenticators 来验证用户。您能否在您的身份 validator 实现中编写您的身份验证逻辑。

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

现在让我们使用这个 validator 。在 Application.java 中,将带有我们的身份 validator 的 @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

关于java - 有没有办法有条件地应用注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948271/

相关文章:

Java 序列打印

java - 如果失败,则让等待函数不断执行某些操作

java - jar 文件的大小会影响 JVM 的性能吗?

cas - Jasig CAS 服务器的默认登录凭据是什么?

java - CAS Rest API 总是导致 HTTP 状态 415

java - 从字符串动态转换对象

java - JBOSS 网络服务注解

java - 动态类注解

java - 如何使用 JPA 注释注释 MYSQL 自动增量字段