Spring Security:如何在applicationContext.xml中获取授权用户

时间:2015-02-09 09:06:13

标签: java spring spring-security

抱歉我的英文。如何在applicationContext.xml中获取授权用户

Authentication上课:

public class Authentication {
    public Account getAccount(){
        return (Account) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

在文件applicationContext.xml中:

<bean id="Authentication" class="com.otv.util.Authentication">
</bean>

<bean id="CurrentAccount"
      factory-bean="Authentication"
      factory-method="getAccount"/>

但它不起作用:

  

加载应用程序时出现异常:java.lang.IllegalStateException:   ContainerBase.addChild:start:org.apache.catalina.LifecycleException:   org.springframework.beans.factory.BeanCreationException:错误   创建名称为&#39; Principal&#39;在ServletContext资源中定义   [/WEB-INF/applicationContext.xml]:bean的实例化失败;   嵌套异常是   org.springframework.beans.factory.BeanDefinitionStoreException:   工厂方法[public com.otv.model.entity.Account   com.otv.util.Authentication.getAccount()]抛出异常;嵌套   异常是java.lang.NullPointerException]]

如何在applicationContext.xml中获得授权用户?

已更新

如果我用作所说的holmis83。我收到错误:

  

org.hibernate.TransientObjectException:object引用未保存的瞬态   instance - 在刷新之前保存瞬态实例:   com.otv.model.entity.Account

在applicationContext.xml中:

<bean id="Authentication" class="com.otv.util.Authentication"/>

<bean id="CurrentAccount" factory-bean="Authentication" factory-method="getAccount" scope="request">
   <aop:scoped-proxy/>
</bean>

<bean id="PostPaginatorDTO" class="com.otv.model.dto.paginator.PostPaginatorDTO" scope="request">
    <property name="account" ref="CurrentAccount" />
</bean>

PostBean上课:

@ManagedProperty(value="#{PostPaginatorDTO}")
public PostPaginatorDTO paginatorDTO;

public List<Post> getEntityList() {

    entityList=getDao().findByPostPaginatorDTO(getPaginatorDTO());

    return entityList;
}

2 个答案:

答案 0 :(得分:0)

启动期间安全上下文中没有授权用户。因此,您面临的是NullPointerException

删除CurrentAccount bean并将Authentication bean重命名为:

<bean id="CurrentAccount" class="com.otv.util.Authentication">
</bean>

现在您可以将CurrentAccount bean连接到您的服务并在运行时检索授权用户:

currentAccount.getAccount()

我强烈建议您将com.otv.util.Authentication重命名为com.otv.util.CurrentAccount,以免弄乱org.springframework.security.core.Authentication

答案 1 :(得分:0)

我猜你正在尝试使用另一个范围而不是默认值创建一个bean,它是单例。使用scope属性。如果要在单例bean中使用scoped bean,最好也使用作用域代理。

<bean id="CurrentAccount" factory-bean="Authentication" factory-method="getAccount" scope="request">
  <aop:scoped-proxy/>
</bean>