Writing a Custom Authorization
In some cases, you might want to apply custom business logic for authorization after a user has been authenticated in Appkit. For example, you might want to load group and role information from an external database or directory, in those cases where the authentication provider does not provide this information.
This is relatively easy to do in Appkit, if you follow these steps.
1. Implement your own authorization filter
MyAuthorizationFilter.java
import com.google.inject.Singleton;
import twigkit.model.auth.AnonymousUser;
import twigkit.model.auth.Role;
import twigkit.model.auth.User;
import twigkit.security.SecurityContext;
import twigkit.security.filter.AuthorisationFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Singleton
public class MyAuthorizationFilter implements AuthorisationFilter {
@Override
public void init() {
}
@Override
public boolean filter(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception {
if (SecurityContext.getUser() != null && !(SecurityContext.getUser() instanceof AnonymousUser)) {
User user = SecurityContext.getUser();
List<Role> roles = null; // implement your own business logic here
for (Role role : roles) {
user.addRole(role);
}
}
return true;
}
@Override
public void destroy() {
}
}
2. Bind your authorization filter in Guice
Assuming you already have a Guice application module, add your authorization filter to the authorization bindings like so:
MyAppModule.java
import com.google.inject.multibindings.Multibinder;
import twigkit.AbstractTwigKitModule;
import twigkit.security.filter.AuthorisationFilter;
public class MyAppModule extends AbstractTwigKitModule {
@Override
protected void configure() {
Multibinder<AuthorisationFilter> authorisationBinder = Multibinder.newSetBinder(binder(), AuthorisationFilter.class);
authorisationBinder.addBinding().to(MyAuthorizationFilter.class);
}
}
If you do not already have a Guice app module, simply create one like above, and add an entry to src/main/resources/META-INF/services/twigkit.TwigKitModule
(note the capitalization of TwigKitModule) containing the Fully-Qualified Class Name of the module. That is, in src/main/resources/META-INF/services/twigkit.TwigKitModule
add the entry:
your.package.MyAppModule