我希望拦截并验证请求的身份验证标头,然后才能到达控制器的操作并检查标头是否有效。如果它有效,那么我将让操作解决它,但如果不是,我会将用户重定向到登录页面或发送403错误。
如何在Play 2.4中实现这一目标?
答案 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。