lundi 2 mars 2015

Add Maintenance Mode to Spring (Security) app

I'm looking for a way to implement a Maintenance Mode in my Spring app.


While the app is in Maintenance Mode only users role = MAINTENANCE should be allowed to log in. Everyone else gets redirected to login page.


Right now I just built a Filter:



@Component
public class MaintenanceFilter extends GenericFilterBean {
@Autowired SettingStore settings;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(settingStore.get(MaintenanceMode.KEY).isEnabled()) {
HttpServletResponse res = (HttpServletResponse) response;
res.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
} else {
chain.doFilter(request, response);
}
}
}


And added it using:



@Override
protected void configure(HttpSecurity http) throws Exception {
http
// omitted other stuff
.addFilterAfter(maintenanceFilter, SwitchUserFilter.class);
}


Because as far as I figured out SwitchUserFilter should be the last filter in Spring Security's filter chain.


Now every request gets canceled with a 503 response. Though there's no way to access the login page.


If I add a redirect to the Filter, this will result in an infinite loop, because access to login page is also denied.


Additionally I can't figure out a nice way to get the current users roles. Or should I just go with SecurityContextHolder ?




I'm looking for a way to redirect every user to the login page (maybe with a query param ?maintenance=true) and every user with role = MAINTENANCE can use the application.


So the Filter / Interceptor should behave like:



if(maintenance.isEnabled()) {
if(currentUser.hasRole(MAINTENANCE)) {
// this filter does nothing
} else {
redirectTo(loginPage?maintenance=true);
}
}

Aucun commentaire:

Enregistrer un commentaire