2014-03-13 37 views
2

我似乎無法找到一個示例來從我的JPA對象中加載[users]和[url]。 我只想爲[main]部分使用shiro.ini。配置Apache Shiro完全從JPA實體加載[url]部分

的是我取得了迄今爲止的源代碼是這樣的: Unable to @Inject my DAO in a Custom Apache Shiro AuthorizingRealm

有什麼例子,其中[用戶](用戶/密碼)和[網址](角色,權限)完全從數據庫中加載?我似乎無法在任何地方找到。我現在正在尋找它一個星期。

+0

你在web.xml中使用org.apache.shiro.web.env.EnvironmentLoaderListener嗎? –

+0

我使用擴展EnvironmentLoaderListener的我自己的CustomEnvironmentLoaderListener。它正在web.xml中聲明。 – MBarni

回答

1

一些經過長期的研究,「最好」的解決方案,我想出了是這樣的:

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()爲空,則需要更多的編碼。 如果有人需要整個代碼,請告訴我。

+0

嗨MBarni,我也有類似的要求來保存和加載數據庫的URL授權,所以你可以請分享整個代碼。所以我可以理解它可以實現的方式。 – Coder