我试图使用request().username()
获取会话用户名。在我的安全课程中,我覆盖了getUsername()
以获取如下的电子邮件密钥:
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());
}
登录时,我设置会话:
public static Result authenticate(){
Form<Login> loginForm = Form.form(Login.class).bindFromRequest();
if(loginForm.hasErrors()){
return badRequest(login.render(loginForm));
}
else{
session().clear();
session("email",loginForm.get().email);
return redirect(routes.Application.problems());
}
}
我可以看到这个有效,因为在我的浏览器中,当我登录时,我有这个:
""37fbf73f635e5f6a37323396add131da2b7cbcf6-email=bob@example.com""
但是,当我在这里使用request()。username()时,我得到一个空值。
public static Result addProblem(){
create("new", "new", "new", "new", "new", request().username());
return redirect(routes.Application.problems());
}
答案 0 :(得分:0)
所以看来您可以使用session().get("email")
而不是request().username()
,但是,我正在关注播放文档并在此处使用后者:
public static Result add() {
Project newProject = Project.create(
"New project",
form().bindFromRequest().get("group"),
**request().username()**
);
return ok(item.render(newProject));
}
答案 1 :(得分:0)
This is where request.username()
的值在Play中设置。
因此,在您想要保护的控制器中,您是否添加了@Security.Authenticated(Security.class)
注释? Like this
基本上它是使用action composition在每次请求控制器操作之前在request()
上设置用户名。在您的示例中,以下内容应该有效:
@Security.Authenticated(Secured.class)
public class Problems extends Controller {
public static Result addProblem() {
create("new", "new", "new", "new", "new", request().username());
return redirect(routes.Application.problems());
}
...
}
关注this sample project了解更多信息。