Nano Hash - криптовалюты, майнинг, программирование

Spring Security 4 Предварительная авторизация аннотации управляемого компонента JSF

Я надеюсь, что кто-нибудь поможет мне интегрировать аннотацию @PreAuthorize с управляемыми компонентами. Я пытался заставить это работать в течение последних нескольких часов, но, видимо, мне чего-то не хватает. Мое исследование в Интернете показало, что элемент безопасности глобального метода можно использовать с Spring или с аспектом. Поскольку я не хочу объявлять свои управляемые bean-компоненты как spring bean-компоненты, я решил использовать аспект. По какой-то причине аннотация PreAuthorize полностью игнорируется. Я не получаю никаких ошибок, и все компилируется и работает нормально, но в управляемом компоненте нет проверки безопасности. Видимо аспектж требует какой-то сотка??? Может быть, я подхожу к этому неправильно, и есть более простой способ... не уверен. Использование Tomcat 7 с JSF 2.2 и Spring Security 4. У меня есть аннотация к классу, но это может быть моей проблемой. Я предполагаю, что размещение его в классе будет использовать его метод конструктора по умолчанию.

Может кто-нибудь посоветовать? (конфиги ниже)

безопасность.xml

<b:beans xmlns="http://www.springframework.org/schema/security"
     xmlns:b="http://www.springframework.org/schema/beans"
     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.xsd
                    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

<http use-expressions="true">
    <headers>
        <frame-options policy="SAMEORIGIN" />
    </headers>
    <intercept-url pattern="/admin/**" access="hasRole('Admin')" />
    <intercept-url pattern="/cms/**" access="hasAnyRole('Admin','CMS_Admin')" />
    <form-login login-page='/login' default-target-url="/" />
    <logout invalidate-session="true" logout-success-url="/" />
    <csrf disabled="true"/>
</http>

<b:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<b:bean name="iberisUserDetailsService" class="com.bizznetworxonline.iberis.core.web.controllers.admin.security.IberisUserDetailsService"/>

<authentication-manager>
    <authentication-provider user-service-ref='iberisUserDetailsService'>
        <password-encoder ref="bcryptEncoder"/>
    </authentication-provider>
</authentication-manager>

<global-method-security mode="aspectj" pre-post-annotations="enabled" proxy-target-class="true">
</global-method-security>

</b:beans>

Сборка Maven

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <showWeaveInfo>true</showWeaveInfo>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework.security</groupId>
                        <artifactId>spring-security-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>

Управляемый компонент

@ManagedBean
@ViewScoped
@PreAuthorize("hasAnyRole('Admin')")
public class ProductManagement

Ответы:


1

Поскольку вы инструктируете JSF создать свой bean-компонент, а не Spring, @PreAuthorize не имеет большого смысла. Даже при использовании Spring для создания bean-компонента его использование нацелено на методы (даже если вы можете аннотировать класс для обработки всех его методов):

@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);

Здесь Spring проверяет, есть ли у текущего вошедшего пользователя роль USER, чтобы он мог создать контакт.

Кажется, что вы хотите ограничить в своем вопросе доступ ко всему представлению, так почему бы не пойти тем же путем, что и в объявлении security.xml?

<intercept-url pattern="/products/product_management.xhtml" access="hasRole('USER')" />

Таким образом, безопасность Spring проверяет разрешение в своем веб-фильтре, что даже лучше.

Смотрите также:

23.06.2016
  • Я надеялся, что он заблокирует вызов конструктора при объявлении на уровне класса. Я попробовал это по определенному методу, и он все еще не работает. Это нормально, потому что я думаю, что делаю это неправильно, как вы сказали. Я буду придерживаться стандартного URL-адреса перехвата, а затем создам свой собственный небольшой класс утилит безопасности для проверки определенных методов. Думаю, это даст мне более тонкий контроль. Таким образом, я могу установить разрешения в своей базе данных на основе ролей. Чем меньше борьбы с весенней безопасностью, тем лучше. 24.06.2016
  • @ user2677597 Я немного изменил свой ответ, чтобы лучше объяснить проблему. Как я уже сказал, нет возможности использовать аннотации spring в bean-компоненте JSF. Вы все равно можете превратить его в bean-компонент Spring (см. Spring docs, часть интеграции с другими фреймворками). Если вы пойдете по этому пути, вам придется реализовать свою пользовательскую область для эмуляции области представления JSF, но у вас уже есть некоторые реализации, сделанные в Интернете. 24.06.2016
  • @user2677597 user2677597 Ты решил это? Что вы сделали, чтобы получить уровень аннотации в методе управляемых компонентов? 17.10.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..