Adi*_*l F 12 apache authentication rest spring-mvc shiro
我试图将Shiro整合到我的spring mvc应用程序中.身份验证由LDAP服务器支持,我能够成功地对ldap服务器进行身份验证并获取cookie.
我无法执行的是在后续请求中使用此cookie并获得结果.尝试使用cookie给我一个HTTP 302来再次执行身份验证.例如:GET on(rest/assets/list),标题Cookie: JSESSIONID=abcd重定向为(rest/login)
这是保护api的正确策略吗?api正在被AngularJS应用程序使用,我希望在添加CRUD功能之前启用基于用户组的身份验证.
任何指针都很有用.
源代码如下:
applicationContext.xml文件如下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"/>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
<bean id="ldapRealm" class="com.directv.nmsupport.security.LDAPRealm">
<property name="contextFactory" ref="ldapContextFactory" />
<property name="userDnTemplate" value="uid={0},ou=DirecTV,ou=People,dc=swengdtv,dc=net" />
</bean>
<bean id="ldapContextFactory" class="org.apache.shiro.realm.ldap.JndiLdapContextFactory">
<property name="url" value="ldap://teon:389"/>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="ldapRealm"/>
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionManager" ref="sessionManager" />
</bean>
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionIdCookieEnabled" value="true" />
</bean>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/rest/login"/>
<property name="filterChainDefinitions">
<value>
/rest/login = anon
/rest/** = user
</value>
</property>
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
LDAPRealm.java代码是
public class LDAPRealm extends JndiLdapRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) getAvailablePrincipal(principals);
return super.doGetAuthorizationInfo(principals); //To change body of overridden methods use File | Settings | File Templates.
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
return super.doGetAuthenticationInfo(token); //To change body of overridden methods use File | Settings | File Templates.
}
Run Code Online (Sandbox Code Playgroud)
}
LoginController.java是
@Controller
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public void login(@RequestBody UserCredentials user) {
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
token.setRememberMe(true);
SecurityUtils.getSecurityManager().authenticate(token);
Subject subject = SecurityUtils.getSubject();
subject.getSession(true);
}
@RequestMapping(value="/logout")
public void logout() {
Subject subject = SecurityUtils.getSubject();
SecurityUtils.getSecurityManager().logout(subject);
}
Run Code Online (Sandbox Code Playgroud)
}
从apache shiro登录是
17:47:54.428 ["http-bio-8080"-exec-7] DEBUG o.a.shiro.realm.ldap.JndiLdapRealm - Authenticating user 'afulara' through LDAP
17:47:54.428 ["http-bio-8080"-exec-7] DEBUG o.a.s.r.ldap.JndiLdapContextFactory - Initializing LDAP context using URL [ldap://teon:389] and principal [uid=afulara,ou=DirecTV,ou=People,dc=swengdtv,dc=net] with pooling disabled
17:47:54.431 ["http-bio-8080"-exec-7] DEBUG o.a.shiro.realm.AuthenticatingRealm - Looked up AuthenticationInfo [afulara] from doGetAuthenticationInfo
17:47:54.431 ["http-bio-8080"-exec-7] DEBUG o.a.shiro.realm.AuthenticatingRealm - AuthenticationInfo caching is disabled for info [afulara]. Submitted token: [org.apache.shiro.authc.UsernamePasswordToken - afulara, rememberMe=true].
17:47:54.431 ["http-bio-8080"-exec-7] DEBUG o.a.s.authc.AbstractAuthenticator - Authentication successful for token [org.apache.shiro.authc.UsernamePasswordToken - afulara, rememberMe=true]. Returned account [afulara]
17:48:20.927 ["http-bio-8080"-exec-9] DEBUG o.a.shiro.web.servlet.SimpleCookie - Found 'JSESSIONID' cookie value [02b41ee8-e9e3-43e5-8ee3-aae72322fede]
17:48:24.204 ["http-bio-8080"-exec-10] DEBUG o.a.shiro.web.servlet.SimpleCookie - Found 'JSESSIONID' cookie value [02b41ee8-e9e3-43e5-8ee3-aae72322fede]
17:48:24.210 ["http-bio-8080"-exec-10] WARN o.s.web.servlet.PageNotFound - Request method 'GET' not supported
Run Code Online (Sandbox Code Playgroud)
由于人们要求我将我的答案作为单独的答案发布,所以就在这里。
我没有使用 Apache Shiro。
PS:并不是说 Apache shiro 不好。我刚刚发现 Spring Security 更容易满足我的特定需求。青年MMV
| 归档时间: |
|
| 查看次数: |
8603 次 |
| 最近记录: |