一些經過長期的研究,「最好」的解決方案,我想出了是這樣的:
shiro.ini
[main]
jsfFilter = com.test.security.CustomAuthorizationFilter
jsfFilter.loginUrl = /login.jsf
[urls]
/** = jsfFilter
//你可以添加方法,以濾除BalusC裏面描述的Ajax請求這個過濾器。 CustomAuthorizationFilter.java
public class CustomAuthorizationFilter extends AuthorizationFilter {
@Override
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (!httpRequest.getRequestURI().startsWith(httpRequest.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
Subject subject = SecurityUtils.getSubject();
AuthenticatingSecurityManager authenticatingSecurityManager = ((AuthenticatingSecurityManager) SecurityUtils.getSecurityManager());
PrincipalCollection principals = subject.getPrincipals();
JPARealm jpaRealm = (JPARealm) authenticatingSecurityManager.getRealms().iterator().next();
AuthorizationInfo authorizationInfo = jpaRealm.getAuthorizationInfo(principals);
for (String permission : authorizationInfo.getStringPermissions()) {
if (pathsMatch(permission, request)) {
return true;
}
}
} else {
return true;
}
return false;
}
}
的pathsMatch(permission, request)
方法將嘗試驗證/比較與用戶試圖訪問路徑接收到的字符串權限。 這個過濾器總是依靠經過認證的用戶。 如果subject.getPrincipal()
爲空,則需要更多的編碼。 如果有人需要整個代碼,請告訴我。
你在web.xml中使用org.apache.shiro.web.env.EnvironmentLoaderListener嗎? –
我使用擴展EnvironmentLoaderListener的我自己的CustomEnvironmentLoaderListener。它正在web.xml中聲明。 – MBarni