我有一个使用spring mvc和spring security 3.2开发的网络应用程序。我希望我的应用程序使用http基本身份验证进行休息服务,并为其他部分形成登录身份验证。以下是我的安全配置:
<http pattern="/services/**" create-session="stateless" use-expressions="true">
<intercept-url pattern="/**" access="hasRole('ROLE_REMOTE,ROLE_USER')"/>
<http-basic />
</http>
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/static/**" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<form-login login-page="/login.do" always-use-default-target="true" default-target-url="/main.do" />
<logout invalidate-session="true" logout-success-url="/login.do"
logout-url="/j_spring_security_logout" />
</http>
我的期望是:当用户从表单登录时,它可以调用restful服务而无需经过基本身份验证(因为它已经过身份验证)。我的想法是角色为“ROLE_USER”的用户也应该调用restful服务。但是,我得到的是从表单登录后,我还被提示进行基本身份验证,尝试从浏览器调用restful服务。
有没有得到我期望的结果?
答案 0 :(得分:3)
答案可能在description of the create-session
attribute:
never
- Spring Security永远不会创建会话,但如果应用程序会使用,则会使用一个会话。stateless
- Spring Security不会创建会话并忽略会话以获取Spring身份验证。由于您选择了stateless
,因此在忽略表单登录后会话中会保留auth对象。尝试never
按预期工作。