抱歉我的英文。如何在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;
}
答案 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>