Spring Security 登录页面
Posted
技术标签:
【中文标题】Spring Security 登录页面【英文标题】:Spring Security Login Page 【发布时间】:2011-11-13 18:15:24 【问题描述】:我开发了一个使用 Spring Security 的默认登录页面的应用程序。但是我想实现我自己的登录页面。我将放置一个 login.html 而不是 jsp 页面。我想为此使用 JQuery。我检查了许多示例,但无法实现。我是 Spring 和 Spring Security 的新手,我使用 Spring Security 3。 任何想法我应该遵循哪些步骤?
【问题讨论】:
嗨,我也在尝试使用plain HTML + jQuery + Spring Security
创建一个登录页面。你有没有想过如何包含 Spring Security 对 CSRF 的内置支持。
【参考方案1】:
Spring Security中自定义登录页面有四个要求:
-
有一个名为
j_username
的输入字段将包含用于身份验证凭据的名称。
有一个名为j_password
的输入字段将包含用于身份验证凭据的密码。
POST
ed 这些值的 url 与 Spring Security 配置中 form-login
元素的 login-processing-url
属性中定义的 url 匹配。
必须在 Spring Security 配置中 form-login
元素的 login-page
属性中指定自定义登录表单的位置。
Login.html
<body>
<form action="/j_spring_security_check" method="POST">
<label for="username">User Name:</label>
<input id="username" name="j_username" type="text"/>
<label for="password">Password:</label>
<input id="password" name="j_password" type="password"/>
<input type="submit" value="Log In"/>
</form>
</body>
Spring 安全配置文件
<http use-expressions="true">
<intercept-url pattern="/login*" access="isAnonymous()"/>
<intercept-url pattern="/**" access="isFullyAuthenticated()"/>
<form-login
login-page="/login.html"
login-processing-url="/j_spring_security_check.action"
authentication-failure-url="/login_error.html"
default-target-url="/home.html"
always-use-default-target="true"/>
</http>
【讨论】:
我应该写一个 LoginLogoutController 或类似的东西,如果用户成功登录,我将如何设置重定向? 感谢您的回答。我用萤火虫调试它,它说:localhost:8080/j_spring_security_check 302 临时移动了那个重定向问题。 如果您已在您的web.xml
中正确注册了springSecurityFilterChain
,并且它在您的任何其他过滤器之前注册,则它应该接收对login-processing-url
指定的url 的任何请求。
经过我的编辑,您可以看到default-target-url
和always-use-default-target
属性。这些将定义用户在通过身份验证后是否将被定向到默认页面,如果是,则该页面是什么。如果always-use-default-target
为假,则应将用户重定向到他们最初尝试访问的任何页面。
@kamaci:如果您仍然感兴趣,这是一篇关于如何配置基于自定义表单的登录的好文章codehustler.org/blog/spring-security-form-login-tutorial【参考方案2】:
我已经为在我的项目中实现 Spring Security 工作了几天,最终实现的配置如下:
spring-security.xml
<security:http auto-config="true" disable-url-rewriting="true" use-expressions="true">
<security:form-login
login-page="/login.html"
login-processing-url="/j_spring_security_check.action"
default-target-url="/index.html"
always-use-default-target="true"
authentication-failure-url="/login.html?error=true" />
<security:intercept-url pattern="/login*" access="isAnonymous()" />
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select username, password, enabled from smartcaldb.users where username=?"
authorities-by-username-query="select u.username, r.authority from smartcaldb.users u, smartcaldb.roles r where u.userid = r.userid and u.username =?" />
</security:authentication-provider>
</security:authentication-manager>
spring-config.xml
<mvc:annotation-driven />
<context:component-scan base-package="com.smartcal.**" />
<!-- setup database connectivity bean -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="$jdbc.driverClassName" />
<property name="url" value="$jdbc.url" />
<property name="username" value="$jdbc.username" />
<property name="password" value="$jdbc.password" />
</bean>
<context:property-placeholder location="/WEB-INF/jdbc.properties" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
web.xml
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-config.xml
/WEB-INF/spring-security.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/login</url-pattern>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<error-code>403</error-code>
<location>/403</location>
</error-page>
login.html
<body>
<form action="/smartcal/j_spring_security_check.action" method="POST">
<label for="username">User Name:</label>
<input id="username" name="j_username" type="text" />
<label for="password">Password:</label>
<input id="password" name="j_password" type="password" />
<input type="submit" value="Log In" />
</form>
</body>
注销使用 url - "/yourAppPathInTheContainer/j_spring_security_logout"
【讨论】:
以上是关于Spring Security 登录页面的主要内容,如果未能解决你的问题,请参考以下文章
如何使初始登陆页面不是spring security的登录表单?