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

@PreAuthorize аннотация не работает spring безопасность

Я нашел много похожих вопросов, но никто не решил мою проблему. Моя проблема ROLE_USER может получить доступ к функциям ROLE_ADMIN

Ниже приведен мой spring -security.xml код.

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:s="http://www.springframework.org/schema/security"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/security
                    http://www.springframework.org/schema/security/spring-security-3.0.xsd">   

<s:http auto-config="true" use-expressions="true">
    <s:intercept-url pattern="/index.jsp" access="permitAll" />
    <s:intercept-url pattern="/welcome*" access="hasRole('ROLE_USER')" />
    <s:intercept-url pattern="/helloadmin*" access="hasRole('ROLE_ADMIN')" />

    <s:form-login login-page="/login" default-target-url="/welcome"
        authentication-failure-url="/loginfailed" />
    <s:logout logout-success-url="/logout" />
</s:http>

<s:authentication-manager>
  <s:authentication-provider>
    <s:user-service>
        <s:user name="asif" password="123456" authorities="ROLE_USER,ROLE_ADMIN" />
        <s:user name="raheel" password="123456" authorities="ROLE_USER" />          
    </s:user-service>
  </s:authentication-provider>
</s:authentication-manager>

когда я добавляю <s:global-method-security pre-post-annotations="enabled"/> мой код показывает, что не найдена ошибка ресурса, и когда я удаляю свой код успешно, но ROLE_USER может получить доступ к ROLE_ADMIN функциям

Моя функция контроллера.

@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

    org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities());
    return "deleteUsers";

}
4b9b3361

Ответ 1

Вы должны иметь

<s:global-method-security pre-post-annotations="enabled"/>

Если вы хотите, чтобы аннотации @PreAuthorize работали.


Чтобы ответить на комментарий:

Похоже, вам не хватает зависимости spring-aop.

Если вы используете maven, вам нужно:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

Если нет, вы можете получить банку из здесь.

Ответ 2

Если вы используете XML-конфигурацию, не забудьте добавить следующий атрибут:

<s:global-method-security pre-post-annotations="enabled"/>

Если вы используете конфигурацию Java, не забудьте добавить следующую аннотацию:

@EnableGlobalMethodSecurity(prePostEnabled = true)

Ответ 3

Я столкнулся с той же проблемой. Моя проблема решена, когда я переместил элемент ниже из applicationContext.xml в * -servlet.xml(моя конфигурация диспетчера xml).

<security:global-method-security secured-annotations="enabled"/>

Вы должны включить этот элемент в свой диспетчер xml NOT на ваше приложение xml.
Spring Часто задаваемые вопросы

Ответ 4

Попробуйте с аннотацией @Secured,

Тогда у вас будет

@Secured("ROLE_ADMIN")
@RequestMapping(value="/delete", method = RequestMethod.GET)
public String DeleteAll(ModelMap model, Principal principal ) {

  ...

}

Здесь подробное сообщение в блоге об этом.

Ответ 5

Ни один из вышеперечисленных ответов не работал у меня. Мне пришлось идти по пути добавления защитников.

Декораторы размещаются на beans внутри файла servlet-context.xml.

Сначала добавьте схему безопасности в пространство имен XML:

<beans:beans xmlns="http://www.springframework.org/schema/mvc"
...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

Затем примените декоратор к реализации службы bean, например...

<beans:bean id="myService" class="my.service.impl.MyServiceImpl" scope="request">
    <security:intercept-methods>
        <security:protect access="ROLE_USER" method="get*"/>
        <security:protect access="ROLE_ADMIN" method="set*"/>
    </security:intercept-methods>
</beans:bean>

Ответ 6

Это может помочь вам:

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>

С уважением.

Ответ 7

Эта проблема возникает при использовании Servlet 3 с поддержкой Web Async. Spring Безопасность 3.1.4 и ниже теряют свой контекст безопасности после ввода анонимного метода метода Callable.

Обновление Spring Безопасность до 3.2.0 RC1 решит ваши проблемы.

Зависимость от Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.2.0.RC1</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

Ответ 8

поместите ниже тег в другой файл конфигурации spring, а не в файл конфигурации безопасности spring.

Я тоже получал ту же ошибку.

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>