Spring Security 4 JSF托管bean预授权注释

时间:2016-06-22 20:12:57

标签: jsf spring-security authorization

我希望有人可以帮助我将@PreAuthorize注释与托管bean集成。我一直试图让这个工作在最后几个小时,但显然有一些我想念的东西。我对网络的研究表明,global-method-security元素可以与spring或aspectj一起使用。因为我不想将我的托管bean声明为spring bean,所以我选择使用aspectj。出于某种原因,PreAuthorize注释完全被忽略。我没有得到任何错误,一切编译并运行正常,但没有安全检查托管bean。显然,aspectj需要某种编织???也许我正在接近这种错误的方式,并且有一种更简单的方法......不确定。使用Tomcat 7与JSF 2.2和Spring Security 4.我在类上有注释,但这可能是我的问题。我假设将它放在类上将使用其默认构造函数方法。

有人可以提供建议吗? (下面的配置)

的security.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 build

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

Managed Bean

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

1 个答案:

答案 0 :(得分:3)

当你指示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安全性会检查其Web过滤器中的权限,这更好。

另见: