使用Spring Security进行自动登录验证

**

原文来自师兄的博客

**:
http://blog.csdn.net/df19900725/article/details/78085152

http://www.datalearner.com/blog/1051506310769424

在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于SpringMVC、SpringSecurity框架的网站系统。在这篇博客中,我们将继续描述如何使用Spring Security进行登录验证。 原文地址:http://www.datalearner.com/blog/1051506310769424 总结一下Spring Security的登录验证关键步骤: 1、在数据库中建好三张表,即users、authorities和persistent_logins三个。注意字段的定义,不能少,可以多,名字必须按规定来。 2、在Spring Security的配置文件中,配置好登录跳转的页面,登录处理的页面和加密情况。 3、在前台的jsp页面中,登录的字段必须和后台users表中的一致,一般都是username和password。 4、注册页面必须自己写,注册的处理也要自己写。 ### 一、创建数据表 使用Spring Security进行登录验证,需要我们在数据库中建好相应的表,并且字段要和Spring Security内置的字段一致。主要有3张表需要建立。一是users表,包含用户名和密码以及用户状态的表;第二个是authorities表,表明该用户角色的,方便做角色控制,比如是ROLE_USER还是ROLE_ADMIN(比如admin页面可能需要用户的ROLE_ADMIN权限,而ROLE_USER权限无法登录这个管理页面);最后一个是persistent_logins表,是登录状态的记录表,主要用来提供支持“记住我”功能的。三张表的创建语句如下:

#create users table
CREATE TABLE `users` (
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  UNIQUE KEY `account` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#create authorities table
CREATE TABLE `authorities` (
  `username` varchar(50) NOT NULL,
  `authority` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#create persistent_logins table
CREATE TABLE `persistent_logins` (
  `username` varchar(64) NOT NULL,
  `series` varchar(64) NOT NULL,
  `token` varchar(64) NOT NULL,
  `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

记住,这三张表字段一定要至少包含以上字段。这样Spring Security才能识别。但是,我们也可以额外添加一些字段,比如在users中添加uid等。 ### 二、配置Spring Security的权限控制 配置Spring Security的控制信息就是配置哪些页面需要登录的用户才能访问,登录的页面是那一个,登陆成功跳转到哪里等。以如下配置为例:所有的js等在resources文件夹下的内容都不需要经过过滤器,因为这些都是静态资源。而首页(/),登录页(/signin)、注册页(/register)等不需要用户登录,但是需要经过过滤器(因为我们可能需要获取未登录用户的一些信息)。两种配置方式如下所示。最后我们使用

<form-login login-page="/signin" authentication-failure-url="/signin?login_error" default-target-url="/query"/>

这个配置来说明登录页面是”/signin”,即所有需要用户登录的页面,在用户未登录情况下需要跳转到这个页面,让用户登录。authentication-failure-url配置的是用户登录失败的页面,而default-target-url是配置用户登录成功后跳转的页面。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <!-- 配置为none的不经过任何spring的过滤器 -->
    <http pattern="/resources/**" security="none" />
    <http pattern="/sitemap.xml" security="none" />
    <http pattern="/favicon.ico" security="none" />

    <!-- 配置为permitAll允许用户访问,但依然经过过滤器处理 -->
    <http auto-config="true" use-expressions="true">

        <intercept-url pattern="/"  access="permitAll" />
        <intercept-url pattern="/index*" access="permitAll" />
        <intercept-url pattern="/signin*" access="permitAll" />
        <intercept-url pattern="/login*" access="permitAll" />
        <intercept-url pattern="/register*" access="permitAll" />
        <intercept-url pattern="/invalidsession*" access="permitAll" />
        <intercept-url pattern="/404*" access="none" />

        <form-login login-page="/signin" authentication-failure-url="/signin?login_error" default-target-url="/query"/>
        <logout logout-success-url="/query" delete-cookies="JSESSIONID" />

        <intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" />

        <csrf disabled="true" />
        <access-denied-handler error-page="/403" />

        <remember-me data-source-ref="dataSource" token-validity-seconds="1209600" remember-me-parameter="remember-me" />

        <session-management invalid-session-url="/"> 
            <concurrency-control max-sessions="1"/> 
        </session-management>

    </http>

    <authentication-manager erase-credentials="false">
        <authentication-provider>
            <password-encoder ref="bcryptEncoder" />
            <jdbc-user-service data-source-ref="dataSource" />
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <beans:property name="basenames">
            <beans:list>
                <beans:value>classpath:myMessages</beans:value>
            </beans:list>
        </beans:property>
    </beans:bean>

    <beans:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

</beans:beans>

,表明登录的时候会对密码进行加密,那么后面我们写注册页面的时候必须要对密码加密之后才能存入数据库。 ### 三、创建登录/注册的页面 这里属于前台的范畴,如果我们要使用Spring Security自带的验证方法,需要在前台也配置一样的信息来获取验证需要的字段,如用户名和密码。所以这里也是需要注意的地方。具体的页面核心代码如下(我们的页面使用了Bootstrap的前端工具,所以要引入bootrap和jquery等外部样式和脚本语言才会正常显示,但是这些显示不会影响功能,核心的字段不变即可):

<div class="container">

    <!-- 页面切换代码 -->
    <ul class="nav nav-tabs" id="loginTab" role="tablist">
        <li class="nav-item">
            <a class="nav-link active" id="home-tab" data-toggle="tab" href="#login" 
                role="tab" aria-controls="home" aria-expanded="true">登录</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" id="home-tab" data-toggle="tab" href="#register" 
                role="tab" aria-controls="home" aria-expanded="true">注册</a>
        </li>
    </ul>

    <div class="tab-content" id="myTabContent">
        <!-- 登录页面 -->
        <div id="login" class="tab-pane fade show active" role="tabpanel" aria-labelledby="login-tab">
            <form class="form-signin" action="login" method="post">
                <label for="username" class="sr-only">Email address</label>
                <input type="email" name="username" id="username" class="form-control" placeholder="邮件地址">
                <label for="password" class="sr-only">Password</label>
                <input type="password" name="password" id="password" class="form-control" placeholder="密码">
                <button class="btn btn-lg btn-primary btn-block" type="submit">点击登录</button>
            </form>

        </div>

        <!-- 注册页面 -->
        <div id="register" class="tab-pane fade" role="tabpanel" aria-labelledby="register-tab">
            <div id="register_attention_alert_reg"></div>
            <form class="form-signin" onsubmit="return register()" method="post">
                <label for="registerEmail" class="sr-only">Email address</label>
                <input type="email" id="registerEmail" name="registerEmail" class="form-control" placeholder="邮件地址">
                <label for="registerPassword" class="sr-only">Password</label>
                <input type="password" name="password" id="registerPassword" class="form-control" placeholder="密码">
                <label for="inputPassword2" class="sr-only">Password</label>
                <input type="password" id="inputPasswordForRegister2" class="form-control" placeholder="请再次输入密码">
                <button class="btn btn-lg btn-primary btn-block" onclick="submit">点击注册</button>
            </form>
        </div>
    </div>

</div>

这里有两个Tab页代码,一个是登录Tab一个是注册Tab。主要是登录的Tab要和Spring Security一致,即登录的处理应当是 login,即 action="login",用户名的ID和name应该是 username,而密码的应该是 password,即提交给登录验证的两个参数应当是username和password,处理的请求页是 login

具体详细介绍请看师兄的原文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Spring Security自动登录功能,你可以按照以下步骤进行操作: 1. 确保你已经将Spring Security添加到你的项目中,并配置好了基本的安全设置。 2. 创建一个实现了`UserDetailsService`接口的类,用于从数据库或其他数据源中加载用户信息。该接口中的`loadUserByUsername`方法根据用户名返回一个`UserDetails`对象,其中包含了用户的信息和权限。 3. 在Spring Security的配置文件中,使用`rememberMe()`方法启用自动登录功能,并配置相关参数。例如: ```java @Override protected void configure(HttpSecurity http) throws Exception { http .rememberMe() .key("yourSecretKey") // 设置一个密钥,用于生成和验证令牌 .userDetailsService(userDetailsService); // 设置刚才创建的UserDetailsService实现类 } ``` 4. 在用户登录成功后,使用`RememberMeServices`接口提供的方法生成一个持久化的令牌,并将其发送给客户端。 ```java @Autowired private RememberMeServices rememberMeServices; @PostMapping("/login") public String login(HttpServletRequest request, HttpServletResponse response) { // 处理用户登录逻辑 // 生成一个持久化的令牌并发送给客户端 rememberMeServices.loginSuccess(request, response, authentication); } ``` 5. 在应用程序启动,配置一个`PersistentTokenRepository`实现类来管理持久化令牌的存储和检索。你可以选择将令牌存储在数据库中或其他持久化存储器中。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // ... @Bean public PersistentTokenRepository persistentTokenRepository() { // 配置持久化令牌的存储和检索方式 // 例如,可以使用JdbcTokenRepositoryImpl将令牌存储在数据库中 JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); return tokenRepository; } } ``` 通过按照以上步骤进行配置,你就可以实现Spring Security自动登录功能了。当用户登录成功并选择“记住我”选项,下次访问应用程序就会自动使用持久化的令牌进行登录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值