Подтвердить что ты не робот

Apache shiro позволяет нескольким ролям доступ к URL-адресу, который не работает

У меня есть простой веб-проект. Я хочу иметь доступ к нескольким роли в этом проекте, это URL.

sihor.ini раздел URL

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

Я получаю ошибку 401, когда роль администратора пользователя посещает гостевой каталог.

Почему?

Широкая версия 1.2.1

4b9b3361

Ответ 1

Существует еще один вариант: выборочная реализация фильтра ролей с использованием OR для предоставленного ролевого набора вместо AND.

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 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"]

Ответ 2

Вместо

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

попробуйте

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