播放2.4如何在请求到达控制器的动作之前拦截请求?

时间:2016-02-03 10:28:00

标签: playframework-2.0

我希望拦截并验证请求的身份验证标头,然后才能到达控制器的操作并检查标头是否有效。如果它有效,那么我将让操作解决它,但如果不是,我会将用户重定向到登录页面或发送403错误。

如何在Play 2.4中实现这一目标?

1 个答案:

答案 0 :(得分:0)

感谢ALEX GARIBAY's blog。 最后,我可以通过扩展 Security.Authenticator ,在请求到达操作之前执行身份验证。

package models;
import play.mvc.Http;
import play.mvc.Result;
import play.mvc.Security;

public class ActionAuthenticator extends Security.Authenticator {
    @Override
    public String getUsername(Http.Context ctx) {
        String token = getTokenFromHeader(ctx);
        if (token != null) {
            return token;   
        }

        //null if unauthorized
        return null;
    }

    @Override
    public Result onUnauthorized(Http.Context context) {
        return super.onUnauthorized(context);
    }

    private String getTokenFromHeader(Http.Context ctx) {
        String[] authTokenHeaderValues = ctx.request().headers().get("X-AUTH-TOKEN");
        if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
            return authTokenHeaderValues[0];
        }
        return null;
    }
}

然后我可以注释一个需要这样认证的动作。

@Security.Authenticated(ActionAuthenticator.class)
public Result authenticate() {
    return ok("Authenticated");
}

ActionAuthenticator 将在 getUsername 中执行身份验证,如果身份验证有效则返回用户名,如果无效则返回null。