作者:维他柠檬鱼1949 | 来源:互联网 | 2023-05-16 10:09
IhaveimplementedmyownAuthenticatorfromPlayFrameworkandDeadboltHandlerfromDeadbolt.我已经从P
I have implemented my own Authenticator from Play Framework and DeadboltHandler from Deadbolt.
我已经从Play Framework实现了我自己的Authenticator,从Deadbolt实现了DeadboltHandler。
Using the methods onUnauthorized respective onAuthFailure I can send users that are not logged in to the "login page" instead of the actual page they are trying to access.
使用onUututhorized各自onAuthFailure上的方法,我可以将未登录的用户发送到“登录页面”,而不是他们尝试访问的实际页面。
However, instead of sending a user directly to the "login page", I want to specify what page the user should be sent to depending on which page the user tries to reach. For example, if the user tries to access /settings the user should be redirected to the login page. If the user tries to access /player/1 the user should be redirected to another page, say, "create user" page.
但是,我不想将用户直接发送到“登录页面”,而是根据用户尝试访问的页面指定用户应该发送到哪个页面。例如,如果用户尝试访问/设置,则应将用户重定向到登录页面。如果用户尝试访问/ player / 1,则应将用户重定向到另一个页面,例如“创建用户”页面。
I was hoping that there is some smart way to do this with annotations, something like: @someannotation(redirect = route/id) so I can redirect to the relevant route if the user is not logged in, else to the standard "login page".
我希望有一些聪明的方法来做注释,例如:@someannotation(redirect = route / id)所以我可以重定向到相关的路由,如果用户没有登录,否则到标准的“登录页面”。
Any one got any ideas?
任何人有任何想法?
Code snippet example for controller and route method:
控制器和路由方法的代码片段示例:
@Security.Authenticated(Secured.class)
@SubjectPresent(cOntent= "createuser")
@DeferredDeadbolt
public class Settings extends Controller {
@SubjectPresent(cOntent= "login")
@CustomRestrict(value = { @RoleGroup({ UserRole.player}), @RoleGroup(UserRole.server_owner) })
public static Result settings() {
Code snippet example for DeadboltHandler onAuthFailure:
DeadboltHandler onAuthFailure的代码片段示例:
@Override
public F.Promise onAuthFailure(Http.Context context, String content) {
return F.Promise.promise(new F.Function0() {
@Override
public Result apply() throws Throwable {
System.out.println(content);
1 个解决方案
2
There are a couple of different ways you can do this.
有几种不同的方法可以做到这一点。
Approach 1: Repurpose the content
value
方法1:重新调整内容值
In this approach, you can use the content
value of the constraint annotations to give a hint to the handler. You can use a class-level constraint to define the default redirect, e.g. go to the login page, and method-level constraints to override the default redirect. All constraints have the content
value, I'm just using SubjectPresent
as an example; you can also mix constraints, e.g. have SubjectPresent
at the class level and Restrict
at the method level.
在此方法中,您可以使用约束注释的内容值来为处理程序提供提示。您可以使用类级别约束来定义默认重定向,例如转到登录页面,方法级约束覆盖默认重定向。所有约束都有内容值,我只是使用SubjectPresent作为例子;你也可以混合约束,例如在类级别具有SubjectPresent并在方法级别具有Restrict。
@SubjectPresent(cOntent= "login")
public class FooController extends Controller {
public Result settings() {
// ...
}
public Result somethingElse() {
// ...
}
@SubjectPresent(cOntent= "create-user")
public Result viewUser() {
// ...
}
}
In your DeadboltHandler implementation, you would then need a test on the content:
在DeadboltHandler实现中,您需要对内容进行测试:
public CompletionStage onAuthFailure(final Http.Context context,
final Optional content) {
return CompletableFuture.supplyAsync(() -> content.map(redirectKey -> {
final Result result;
if ("login".equals(redirectKey)) {
result = [redirect to login action]
}
else if ("create-user".equals(redirectKey)) {
result = [redirect to create user action]
} else {
result = [redirect to default authorization failure action]
}
}).orElseGet(() -> [redirect to default authorization failure action]), executor);
}
Approach 2: Use the ROUTE_PATTERN tag
方法2:使用ROUTE_PATTERN标记
Instead of specifying keys in the constraint annotations, you can instead use the route specified in the request to determine the requested action.
您可以改为使用请求中指定的路由来确定请求的操作,而不是在约束注释中指定键。
public CompletionStage onAuthFailure(final Http.Context context,
final Optional content) {
final String route = requestHeader.tags().get(Router.Tags.ROUTE_PATTERN);
// examine the route and work out what you want to do
}