上一篇文章對shiro的filter作了一些簡單的介紹,接一下寫寫息自定義shiro的filter。使用shiro的時候,比較常用的filter有anon,authc,roles和perms。當我們想定義某個鏈接是擁有某些權限的用戶才可以訪問的時候,我們可以這樣定義。/xx = roles[A,B]。在shiro中,表示當前用戶同時擁有A,B兩種角色才可以訪問/xx這個鏈接,是一種&&(與)的關系,我們可以看看源碼。在shiro-web-xx.jar的org.apache.shiro.web.filter.authz包下有RolesAuthorizationFilter這樣一個類,這個類就是定義roles的filter。
- public class RolesAuthorizationFilter extends AuthorizationFilter {
-
- //TODO - complete JavaDoc
-
- @SuppressWarnings({"unchecked"})
- public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
-
- Subject subject = getSubject(request, response);
- String[] rolesArray = (String[]) mappedValue;
-
- if (rolesArray == null || rolesArray.length == 0) {
- //no roles specified, so nothing to check - allow access.
- return true;
- }
-
- Set<String> roles = CollectionUtils.asSet(rolesArray);
- return subject.hasAllRoles(roles);
- }
-
- }
上面定義了subject.hasAllRoles(roles);就是當前用戶必須擁有定義的所有角色才會返回true。但有時候,我們需要當前用戶擁有定義的其他一個角色就可以訪問,那就需要寫自己的filter。也很簡單,代碼以下:
- public class AnyRolesAuthorizationFilter extends AuthorizationFilter {
-
-
- @Override
- protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
-
- Subject subject = getSubject(request, response);
- String[] rolesArray = (String[]) mappedValue;
-
- if (rolesArray == null || rolesArray.length == 0) {
- // no roles specified, so nothing to check - allow access.
- return true;
- }
-
- Set<String> roles = CollectionUtils.asSet(rolesArray);
- for (String role : roles) {
- if (subject.hasRole(role)) {
- return true;
- }
- }
- return false;
- }
-
- }
從上面的代碼可以看到,當遍歷,發(fā)現(xiàn)當前用戶擁有定義的其中一個角色就立刻返回true,否則返回false。
定義好filter,只需要代碼默認的roles即可。
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <property name="loginUrl" value="/security/login.html" />
- <property name="successUrl" value="/home.html" />
- <property name="unauthorizedUrl" value="/security/unauthorized.html" />
- <property name="filters">
- <map>
- <entry key="anyRoles" value-ref="anyRolesAuthorizationFilter" />
- </map>
- </property>
- <property name="filterChainDefinitions">
- <value>
- /admin = anyRoles[admin1,admin2]
- /** = anon
- </value>
- </property>
- </bean>
perms的filter也同理??纯丛创a:
- public class PermissionsAuthorizationFilter extends AuthorizationFilter {
-
- //TODO - complete JavaDoc
-
- public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
-
- Subject subject = getSubject(request, response);
- String[] perms = (String[]) mappedValue;
-
- boolean isPermitted = true;
- if (perms != null && perms.length > 0) {
- if (perms.length == 1) {
- if (!subject.isPermitted(perms[0])) {
- isPermitted = false;
- }
- } else {
- if (!subject.isPermittedAll(perms)) {
- isPermitted = false;
- }
- }
- }
-
- return isPermitted;
- }
- }
自定義的filter:
- public class AnyPermissionsAuthorizationFilter extends AuthorizationFilter {
-
- @Override
- protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
- Subject subject = getSubject(request, response);
- String[] perms = (String[]) mappedValue;
-
- for (String perm : perms) {
- if (subject.isPermitted(perm)) {
- return true;
- }
- }
-
- return false;
- }
-
- }
配置使用自定義filter
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <property name="loginUrl" value="/security/login.html" />
- <property name="successUrl" value="/home.html" />
- <property name="unauthorizedUrl" value="/security/unauthorized.html" />
- <property name="filters">
- <map>
- <entry key="anyPerms" value-ref="anyPermissionsAuthorizationFilter" />
- </map>
- </property>
-
- <value>
- /admin/add = anyPerms["admin:delete","admin:add"]
- /** = anon
- </value>
- </property>
- </bean>
當用戶請求/admin/add時,就會調(diào)用自定義的AnyPermissionsAuthorizationFilter來執(zhí)行。
shiro的filter大概講到這里,相信讀者對shiro的filter有更深的認識。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。