当前位置: 首页 > 知识库问答 >
问题:

@preauthorize在Spring上不起作用

晋俊贤
2023-03-14

我实现了spring Security3.2.5,但不幸的是@preauthorize不能用于类和方法。正如我从文档中读到的,@preauthorize应该允许方法和类工作,如果用户在注释中有指定的角色,但我能够运行所有方法或类,而没有任何角色差异。您可以看到security-config.xml和security.context.xml以及我在下面声明@preauthorize注释的类。如果你能帮我解决这个问题我会很高兴的。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans 
xmlns="http://www.springframework.org/schema/security" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

<http pattern="/securityNone" security="none" />

<http use-expressions="true">
    <intercept-url pattern="/**" access="isAuthenticated()" />
    <http-basic />
</http>
<global-method-security pre-post-annotations="enabled" />


<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="alperk" password="123" authorities="ROLE_USER"  />
        </user-service>
    </authentication-provider>
</authentication-manager>
  <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:sec="http://www.springframework.org/schema/security"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans    /spring-beans-3.1.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<bean id="defaultAuthEventPublisher"     class="org.springframework.security.authentication.DefaultAuthenticationEventPublisher"/>

<bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="authenticationProvider"/>
        </list>
    </property>
    <property name="authenticationEventPublisher" ref="defaultAuthEventPublisher"/>
</bean>
<!-- Authentication service reference -->
<bean id="customUserDetailsService" class="tr.com.sistek.utak.authentication.AuthenticationUserDetailsService"/>

<!-- Authentication yapilirken MD5 password sifreleme kullaniliyor -->
 <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>

<bean id="authenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="customUserDetailsService"/>
    <!--<property name="passwordEncoder" ref="passwordEncoder"/>-->
</bean>

<bean id="authenticationSuccessHandler" class="tr.com.sistek.utak.authentication.CustomAuthenticationSuccessHandler">
    <property name="defaultTargetUrl" value="/faces/private/MainMenu.jsf"/>
</bean> 

<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <property name="exceptionMappings">
        <props>
            <prop key="org.springframework.security.authentication.BadCredentialsException">/login-failure.jsf?err=HATALI_PWD</prop>
            <prop key="org.springframework.security.authentication.CredentialsExpiredException">/change-password.jsf</prop>
            <prop key="org.springframework.security.authentication.LockedException">/login-failure.jsf?err=HESAP_KILITLI</prop>
            <prop key="org.springframework.security.authentication.DisabledException">/login-failure.jsf?err=HESAP_PASIF</prop>
        </props>
    </property>
</bean>

<bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/error401.jsf"/>
</bean> 

<!-- Login Esnasinda Girilen Bilgileri Kontrol Etmek Icin Kullanilmistir -->
<bean id="customPreAuthenticationLoginHandler" class="tr.com.sistek.utak.authentication.CustomPreAuthenticationLoginHandler">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="authenticationSuccessHandler" ref="authenticationSuccessHandler" />
    <property name="authenticationFailureHandler" ref="authenticationFailureHandler" />
    <property name="filterProcessesUrl" value="/j_security_check" />

    <property name="sessionAuthenticationStrategy" ref="sas" />

    <property name="postOnly" value="false" />
</bean>

<sec:http pattern="/assets/**" security="none"/>
<sec:http pattern="/images/**" security="none"/>
<sec:http pattern="/resources/**" security="none"/>
<sec:http pattern="/themes/**" security="none"/>
<sec:http pattern="/javax.faces.resource/**" security="none"/>

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


<sec:http auto-config="true" use-expressions="true"  
          authentication-manager-ref="authenticationManager">  


    <sec:intercept-url pattern="/dashboard/**" access="isAuthenticated()"/>
    <sec:custom-filter before="FORM_LOGIN_FILTER" ref="customPreAuthenticationLoginHandler"/>

    <sec:form-login login-page="/login.jsf" 
                    authentication-failure-handler-ref = "authenticationFailureHandler"
                    default-target-url="/faces/private/MainMenu.jsf"/>

    <sec:access-denied-handler ref = "accessDeniedHandler"/>

    <sec:logout invalidate-session="true" 
                logout-success-url="/login.jsf" 
                logout-url="/logout"/>

    <sec:session-management invalid-session-url="/login.jsf" session-authentication-strategy-ref="sas"/>

    <sec:custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />

</sec:http>


<bean id="jsfRedirectStrategy" class="tr.com.sistek.utak.jsf.filter.JsfRedirectStrategy"/>

<bean id="httpSessionSecurityContextRepository" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"/>

<!-- Authentication logout handler -->
<bean id="customAuthenticationLogoutHandler" class="tr.com.sistek.utak.authentication.CustomAuthenticationLogoutHandler"/>

<!-- ******************************************************************* -->
<!-- Concurrent Session Management Configuration-->
<!-- ******************************************************************* -->
<bean id="concurrencyFilter"
      class="org.springframework.security.web.session.ConcurrentSessionFilter">
    <property name="sessionRegistry" ref="sessionRegistry" />
    <property name="expiredUrl" value="/session-expired.jsf" />
    <!-- this permits redirection to session timeout page from javascript/ajax or http -->
    <property name="redirectStrategy" ref="jsfRedirectStrategy" />
</bean>

<bean id="sas" class= "org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
    <constructor-arg name="sessionRegistry" ref="sessionRegistry" />
    <property name="maximumSessions" value="1" />
   <!--        <property name="alwaysCreateSession" value="true" />
    <property name="exceptionIfMaximumExceeded" value="true" />-->
</bean>

<bean id="sessionRegistry"
      class="org.springframework.security.core.session.SessionRegistryImpl" />

豆子:

@ManagedBean
@ViewScoped
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class OrderDetView implements Serializable {

......

共有1个答案

葛晔
2023-03-14

这只是我的第一个想法:

您的注释@managedbean@viewscoped表明您使用的是JSF框架,可能您的OrderDetViewbean只是一个JSF bean,而不是Spring bean。但是@preauthorize仅适用于Spring bean。

 类似资料:
  • 问题内容: 我发现了许多类似的问题,但都没有解决我的问题。我的问题是可以访问的功能 我的spring-security.xml代码如下。 当我添加 我的代码时显示找不到资源错误,并且当我删除我的代码时成功执行但可以访问函数 我的控制器功能是。 问题答案: 你应该有 如果您希望注释起作用。 回答评论: 看来您缺少依赖性。 如果您正在使用Maven,则需要: 如果没有,你可以从这里拿到罐子。

  • 更新: 因为有些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至不需要对“测试”进行组件扫描就可以工作: 现在的问题是,当@repository不工作时,为什么我甚至需要在它上使用componentscan?为什么在文档中@repository是由componentscan扫描的,而@enablejparepostiories是enoguh?

  • 在过去的几天里,我一直在进行故障排除,我似乎无法让表达式hasRole工作。我使用的是sping-Security 4.0.1 我的Spring Securityxml 我的所有角色都存储在数据库中,其模式类似于此链接中的1。在自定义的userDetailService中,我将从数据库中加载它。我的角色价值观是这样的 我甚至试着加上前缀“ROLE\uux”,但我似乎无法实现。 下面是关于如何使用h

  • 我的spring security xml 我的所有角色都存储在数据库中,并且有一个类似于此链接中的1的模式。在我的自定义中,我将从数据库加载它。我的角色价值观是这样的 我甚至尝试过把前缀“role_”,但我似乎不能让它工作。

  • 我正在尝试测试使用标准Spring Security注释和方法保护的web api。我查看了网站上的所有选项,没有任何帮助,下面是代码。没有角色,一切都很好。我为这个问题痛苦了好几天。我会感谢你的帮助,谢谢。 控制器类 如果,然后它返回用户,因为它应该 UserDetailsServiceImp 和添加角色的用户数据 这是数据库返回的内容

  • 问题内容: 当我运行TaskJob时,我得到了空指针异常,因为Spring不会自动装配serviceJob服务。是新线程导致此问题,因为Spring自动连接mysqlService没有任何问题? 我的applicationContext.xml; 我的课是; 编辑: TaskJob实例化; 问题答案: Spring仅自动装配其创建的组件。您正在调用新的TaskJob(),Spring不知道该对象,