我正在尝试在Spring Security Web应用程序中进行简单的用户名/密码身份验证。我有一个通过传入用户名/密码进行身份验证的Web服务,并获得一个角色。然后我需要为将来的Web服务调用保留密码。
我的应用程序最初是使用App Fuse创建的,因此它有一些基于JDBC的身份验证。我已将其删除,但我不确定如何添加自定义身份验证。
文档说它是"simple" to add in such a mechanism。但示例应用程序是命令行hello-world风格程序,而不是Web应用程序。我似乎无法在Web应用程序中找到用户名/密码身份验证的示例。
我的XML文件中有以下内容:
<beans:bean id="myProvider" class="com.example.MyProvider"></beans:bean>
<authentication-manager>
<authentication-provider ref="myProvider"></authentication-provider>
</authentication-manager>
我不知道这是否是我的身份验证的正确位置,我不确定要实现什么接口。我想我可能需要实施AuthenticationManager
。我可以使用UsernamePasswordAuthenticationToken
。
如何将所有这些连接在一起?
答案 0 :(得分:4)
我现在已经开始工作了。谢谢大家的帮助。我不得不添加一个新的身份验证提供程序,并将其连接到身份验证管理器。这是我最后添加的内容:
<beans:bean id="authenticationManager"
class="org.springframework.security.authentication.ProviderManager">
<beans:property name="providers">
<beans:list>
<beans:ref local="myAuthenticationProvider"/>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
</beans:bean>
<authentication-manager>
<authentication-provider ref="myAuthenticationProvider"/>
</authentication-manager>
和MyAuthenticationProvider(取自示例)是:
public class AConnexAuthenticationProvider implements AuthenticationProvider {
static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();
static {
AUTHORITIES.add(new GrantedAuthorityImpl("ROLE_USER"));
}
@Override
public Authentication authenticate(Authentication auth)
throws AuthenticationException {
return new UsernamePasswordAuthenticationToken(auth.getName(), auth.getCredentials(), AUTHORITIES);
}
@Override
public boolean supports(Class<? extends Object> paramClass) {
return true;
}
}
我稍后会添加用户名/密码的实际验证;这个只是允许任何人进入。
答案 1 :(得分:2)
这是我的security.xml所在。看看用户的配置。我只是添加了处理路径的控制器,它工作正常。
<http auto-config="true">
<intercept-url pattern="/admin/**" access="IS_AUTHENTICATED_REMEMBERED"/>
<intercept-url pattern="/welcome/**" access="IS_AUTHENTICATED_REMEMBERED" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<form-login login-page="/login" />
<logout logout-success-url="/" logout-url="/logout" />
<!-- Limits the number of concurent sessions a user can have
<concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true"/>
-->
</http>
<!--
Usernames/Passwords are
rod/koala
dianne/emu
scott/wombat
-->
<authentication-manager>
<authentication-provider>
<password-encoder hash="md5"/>
<user-service>
<user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
<user name="dianne" password="65d15fe9156f9c4bbffd98085992a44e" authorities="ROLE_USER,ROLE_TELLER" />
<user name="scott" password="2b58af6dddbd072ed27ffc86725d7d3a" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
请记住添加web.xml
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
适合我:)
答案 2 :(得分:1)
您的提供商应实施UserDetailsService
,并覆盖
public UserDetails loadUserByUsername(String username)
返回UserDetails对象的方法。这是一个可以在“用户”对象上实现的接口。它需要覆盖几种方法,但从您的角度来看,关键的方法是
public Collection<GrantedAuthority> getAuthorities()
您实现的返回角色列表。