# JSF Navigation - Spring Security Logout Problem



## Mat00 (16. Feb 2010)

Hallo! Ich habe folgendes Problem:

Ich verwende JSF2.0 mit Spring Security 3.0 und es funktioniert super (also login, authorisierung für pages, usw.), allerdings habe ich ein Problem mit dem Logout! Und zwar habe ich den Link zum logout in meinem template.xhtml damit ihn alle Pages haben, das bedeutet aber auch dass der Link von verschiedensten URLs aus aufgerufen wird:
z.b. 
localhost/JSF/home.jsf 
aber auch 
localhost/JSF/components/secured/private.jsf
usw. (JSF ist mein Projektname in dem Fall)

Nun habe ich das Problem dass der Link einfach nicht in beiden Fällen funktioniert, wenn ich z.b.

```
<h:outputLink value="j_spring_security_logout">
		logout2
	</h:outputLink>
```
verwende, dann funktioniert das im ersten Fall aber nicht im 2., weil er dann au f
localhost/JSF/components/securedj_spring_security_logout weiterleitet, und die gibts nicht, der Spring Security logout filter wartet per default ja auf localhost/JSF/j_spring_security_logout

Nagut dachte ich mir, muss ich halt den absoluten Pfad angeben, also "/" davor und gut ists.. Leider ist das Ergebnis etwas ZU absolut, es führt nämlich zu:
localhost/j_spring_security_logout
statt (wie geplant) zu
localhost/JSF/j_spring_security_logout

der tag <h:link> funktioniert übrigens überhaupt nicht.. es erscheint zwar ein label, ist aber nicht klickbar wenn ich versuche j_spring_security_logout darüber aufzurufen

So langsam bin ich verzweifelt.. 
Ich kann das /JSF/ natürlich hardcodieren im template, aber das fände ich echt verdammt unsauber. Bitte hat jemand einen kleinen Tipp wie man das in JSF2.0 sauber lösen kann?


----------



## ttruong (27. Apr 2010)

Hallo,

ich versuche gerade Spring Security 3.0 in JSF 2.0 einzubinden. Kannst du mir ein Beispiel-Code senden, damit ich weiss wie man das macht?

Die Doku von Spring Security hilft da nicht sonderlich weiter.

Danke Tai


----------



## internet (8. Jun 2010)

wäre auch über jede Hilfe dankbar


----------



## ttruong (8. Jun 2010)

For Spring 3 + JSF 2 look here:
Spring 3 + JSF 2 - Spring Community Forums

Here is my complete code for using Spring Security:

web.xml:

```
<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Spring Configurations-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/applicationContext*.xml
		</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>
...
	<!--
		- Publishes events for session creation and destruction through the
		application - context. Optional unless concurrent session control is
		being used.
	-->
	<listener>
		<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
	</listener>

	<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>
```

faces-config.xml:

```
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
			  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
			  version="2.0">
	<!-- Settings for application -->
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
```

applicationContext-security.xml:

```
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="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-3.0.xsd
                         http://www.springframework.org/schema/security
                         http://www.springframework.org/schema/security/spring-security-3.0.xsd">
 
    <global-method-security secured-annotations="enabled" jsr250-annotations="enabled">
    </global-method-security>

    <http use-expressions="true" > <!-- once-per-request is important for forward once-per-request="false"-->
        <intercept-url pattern="/**" access="permitAll" />
		<form-login
			login-processing-url="/j_spring_security_check"
			login-page="/login.jsf"
			default-target-url="/"
			authentication-failure-url="/login.jsf" />
        <logout invalidate-session="true"/>
        <session-management>
            <concurrency-control max-sessions="1" error-if-maximum-exceeded="false" />
        </session-management>
    </http>
 
    <!--
    <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 name="peter" password="22b5c9accc6e1ba628cedc63a72d57f8" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
    -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
                <user name="user1" password="user1" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>


    <!-- Automatically receives AuthenticationEvent messages -->
    <beans:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener"/>
</beans:beans>
```

My LoginBean:

```
@ManagedBean
@Scope("request")
public class LoginBean extends AbstractBean {

    @Inject
    @Named(BeanConst.BEAN_ID_AUTHENTIFICATION_MANAGER)
    protected AuthenticationManager am;

    private String userName;
    private String password;
    
    public String login() {
        try {
            Authentication request = new UsernamePasswordAuthenticationToken(this.getUserName(), getPassword());
            Authentication result = am.authenticate(request);
            SecurityContextHolder.getContext().setAuthentication(result);

        } catch (AuthenticationException e) {
            
            FacesMessage facesMsg = UIHelper.getMessage(FacesMessage.SEVERITY_ERROR, MessageConst.AUTHENTIFICATION_FAILED);
            FacesContext.getCurrentInstance().addMessage(null, facesMsg);
            return null;
        }
        return NavigationConst.HOME;
    }
    
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

HTH Tai
```


----------



## internet (23. Jun 2010)

hast du eine Lösung für das Problem gefunden?
Stehe vor selbigen Problem

Frage: Braucht man überhaupt eine Methode login() ? Das macht doch das Framework, oder nicht?


----------



## pherin (12. Dez 2010)

Mat00 hat gesagt.:


> Hallo! Ich habe folgendes Problem:
> Nun habe ich das Problem dass der Link einfach nicht in beiden Fällen funktioniert, wenn ich z.b.
> 
> ```
> ...



Falls noch interessant bzw. aktuell:
Das Problem kannst du Lösen, indem du den Context-Path der Webapplikation vorne dran schreibst. Das kannst du folgendermaßen machen:

```
<h:outputLink value="#{request.contextPath}/j_spring_security_logout">
	logout2
</h:outputLink>
```


----------

