2013-05-29 6 views
12

Я пытаюсь интегрировать Сиро в мое приложение mvc весны. Аутентификация поддерживается сервером LDAP, и я могу успешно пройти аутентификацию против сервера ldap и получить файл cookie.Apache Shiro для обеспечения REST api

То, что я не могу выполнить, - это использовать этот файл cookie в последующих запросах и получить результаты. Попытка использовать файл cookie дает мне HTTP 302 для повторной проверки подлинности. Например: GET на (rest/assets/list) с заголовком Cookie: JSESSIONID=abcd перенаправляет (rest/login)

Является ли это правильная стратегия для обеспечения апи? 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> 

код 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. 
} 

}

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); 
} 

}

Каротаж от 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 
+1

Последующие меры. Я никогда не получал эту работу и переключился на Spring Security и нашел, что ее больше поддерживают (сообществом и поисковыми системами Google) и завершили эту работу. –

+1

Затем используйте функцию «Отвечайте на свой собственный вопрос». Таким образом, люди могут быстро понять, что ваша проблема уже решена. – dnang

+7

Я думаю, что это не правильная стратегия. Согласно принципам REST, вы не должны создавать сеанс с клиентом. Лучшими способами обеспечения REST api являются ** Базовая аутентификация ** и ** OAuth ** –

ответ

0

Как люди просили, чтобы я отправил свой ответ в виде отдельного ответа, так что вот оно.

Я не использовал Apache Shiro.

PS: Не то, чтобы Apache сиро был плохим. Я просто нашел Spring Security проще в использовании для моей конкретной потребности. YMMV

3

Идея позади REST является то, что это Stateless так, если вы создать сеанс с клиентом вы нарушаете основой работы наноэлектронных RESTful API. Я бы рекомендовал использовать Spring Security, здесь вы можете найти простой пример: http://spring.io/guides/gs/securing-web/. Это займет у вас около 5-10 минут, и вы сможете использовать его в своем проекте.

Также есть простое руководство для подключения к системе LDAP: http://spring.io/guides/gs/authenticating-ldap/

UPDATE: Увидел ваш комментарий на ваш вопрос, я хотел бы предложить вам ответить на ваш вопрос с результатом вы придумали.