2013-02-20 5 views
13

私は簡単なWebプロジェクトを持っています。私はこのプロジェクトで複数の役割にアクセスしたいと思っています。apache shiro複数の役割が動作しないURLにアクセスできるようにする

URLのsihor.iniセクション

[urls] 
/login.xhtml = authc 
/logout = logout 
/admin/** = user, roles[admin] 
/guest/** = user, roles[admin,guest] 

ゲストディレクトリにユーザーadmin訪問の役割私は401エラーを取得しています。

なぜですか?

史郎バージョン1.2.1

答えて

17

別のオプションがあります:役割のカスタム実装ではなくANDのセット提供の役割のためにORを使用してフィルタリングします。

import org.apache.shiro.subject.Subject; 
import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; 

import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import java.io.IOException; 

/** 
* Allows access if current user has at least one role of the specified list. 
* 
* Basically, it's the same as {@link RolesAuthorizationFilter} but using {@literal OR} instead 
* of {@literal AND} on the specified roles. 
* 
* @see RolesAuthorizationFilter 
* @author Andy Belsky 
*/ 
public class AnyOfRolesAuthorizationFilter extends RolesAuthorizationFilter { 

    @Override 
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, 
            Object mappedValue) throws IOException { 

     final Subject subject = getSubject(request, response); 
     final String[] rolesArray = (String[]) mappedValue; 

     if (rolesArray == null || rolesArray.length == 0) { 
      //no roles specified, so nothing to check - allow access. 
      return true; 
     } 

     for (String roleName : rolesArray) { 
      if (subject.hasRole(roleName)) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

shiro.iniでの使用は、このようなものです:

[main] 
... 
anyofroles = com.your.package.AnyOfRolesAuthorizationFilter 

[urls] 
... 
/path/to/some/url = anyofroles["role1,role2"] 
-1

代わりの

/guest/** = user, roles[admin,guest]

/guest/** = user, roles[admin],roles[guest] 
+1

素晴らしいアイデアを試してみるが、これはそうではない悲しそうにeとして働くロールのチェックが強制されます。 –

関連する問題