spring security 安全框架remember me,demo学习

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载。

博主地址是:http://blog.csdn.net/freewebsys

1,spring security

Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。

在安全框架这边使用最多的就是spring security。

论坛资料比较充实。

一个哥们写的例子,使用用的spring secuirty3开发的。

http://www.mkyong.com/spring-security/spring-security-remember-me-example/

spring security 相关内容:

http://www.mkyong.com/tutorials/spring-security-tutorials/

官方api:

http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity.html

首先根据demo下载源代码,解压缩导入工程。

代码很简单,4个jsp文件,一个controller。

数据库使用mysql,创建数据库和表:


CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(45) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  role varchar(45) NOT NULL,
  PRIMARY KEY (user_role_id),
  UNIQUE KEY uni_username_role (role,username),
  KEY fk_username_idx (username),
  CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

INSERT INTO users(username,password,enabled)
VALUES (‘mkyong‘,‘123456‘, true);
INSERT INTO users(username,password,enabled)
VALUES (‘alex‘,‘123456‘, true);

INSERT INTO user_roles (username, role)
VALUES (‘mkyong‘, ‘ROLE_USER‘);
INSERT INTO user_roles (username, role)
VALUES (‘mkyong‘, ‘ROLE_ADMIN‘);
INSERT INTO user_roles (username, role)
VALUES (‘alex‘, ‘ROLE_USER‘);

CREATE TABLE persistent_logins (
    username varchar(64) not null,
    series varchar(64) not null,
    token varchar(64) not null,
    last_used timestamp not null,
    PRIMARY KEY (series)
);

其中persistent_logins 是记录用户remember me的。

使用token换用户名。

具体运行的效果,在那个demo里面已经介绍的非常清楚了。

使用remember me登陆之后会有一个cookie。

当退出之后就没了。

当没用权限的时候返回403。

配置authentication-manager

<authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                users-by-username-query="select username,password, enabled from users where username=?"
                authorities-by-username-query="select username, role from user_roles where username =?  " />
        </authentication-provider>
    </authentication-manager>

首先配置了数据源,按用户名密码查询表users,查询再按照和用户名查询权限。返回权限列表。

当时remember me情况登陆的时候直接查询persistent_logins,用token换用户登陆名,在用户登录名查询用户信息,权限。

但是在做互联网应用的时候,一般用户就一个权限。根本没用role表,不用这么复杂。

3,自定义AuthenticationProvider

首先实现一个UserDetailsService。这里应该进行数据库查询。然后返回UserDetails。这里省略直接创建一个对象,密码写死,只要是登陆成功兜风返回ROLE_USER权限。

public class MyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String userName)
            throws UsernameNotFoundException {
        ArrayList list = new ArrayList();
        list.add(new SimpleGrantedAuthority("ROLE_USER"));
        User details = new User("demo", "demo", list);
        return details;
    }
}

然后实现一个AuthenticationProvider

public class MyAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    UserDetailsService userDetailsService;

    public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        //username
        System.out.println("user name: " + authentication.getName());
        //password
        System.out.println("password: " + authentication.getCredentials());
        System.out.println("getPrincipal: " + authentication.getPrincipal());
        System.out.println("getAuthorities: " + authentication.getAuthorities());
        System.out.println("getDetails: " + authentication.getDetails());
        UserDetails userDetails = (UserDetails) this.userDetailsService.loadUserByUsername(authentication.getName());

        if (userDetails != null && userDetails.getPassword() != null
                && !userDetails.getPassword().equals(authentication.getCredentials())) {
            //如果密码不相同直接抛出异常。
            throw new UserNamePasswordErrorException("用户名或密码错!");
        }

        //如果用户名密码正确。
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(
                userDetails, authentication.getCredentials(), userDetails.getAuthorities());
        return result;
    }

    public boolean supports(Class authentication) {
        return true;
    }

    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
}

这里如果用户名密码错误,直接抛出一个自定义异常:

public class UserNamePasswordErrorException extends AuthenticationException {
    public UserNamePasswordErrorException(String msg) {
        super(msg);
    }
}

然后修改配置:

    <bean id="userDetailsService" class="com.demo.security.auth.MyUserDetailsService"/>
    <bean id="myAuthenticationProvider" class="com.demo.security.auth.MyAuthenticationProvider">
        <property name="userDetailsService" ref="userDetailsService"/>
    </bean>

<authentication-manager>
        <authentication-provider ref="myAuthenticationProvider">
        </authentication-provider>
    </authentication-manager>

4,总结

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载。

博主地址是:http://blog.csdn.net/freewebsys

spring security在安全上面只要配置下就好了,很方便。

但只是进行了初步的研究。比如加密问题,比如cookie改名字的问题,还需要继续研究。

spring security 安全框架remember me,demo学习

时间: 2024-10-06 20:35:51

spring security 安全框架remember me,demo学习的相关文章

Spring Security安全框架

今天来简单介绍一下Spring Security安全框架 简介 Spring Security 提供了基于javaEE的企业应有个你软件全面的安全服务.这里特别强调支持使用SPring框架构件的项目,Spring框架是企业软件开发javaEE方案的领导者.如果你还没有使用Spring来开发企业应用程序,我们热忱的鼓励你仔细的看一看.熟悉Spring特别是一来注入原理两帮助你更快更方便的使用Spring Security. 人们使用Spring Secruity的原因有很多,单大部分都发现了jav

Spring Security安全框架入门篇

一.Spring Security相关概念 1.1..Spring Security介绍: Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对訪问权限进行控制嘛).它提供了一组能够在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能.为应用系统提供声明式的安

spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

最近上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 下面是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一  导入框架所需的包,我们用的事maven 进行对包的管理. 以上的举例是本人的H5DS的真实的后台管理项目,这个项目正在盛情融资中,各位多多捧点人场.关注一下软件发展的动态,说不定以后就是您的生活不可或缺的软件哟. 点击打开链接.闲话少说.现在切入正题. 第二,写点配置文件 第三,spring data -设计一个简单的po关系,这里需要下载一

spring security入门教程 demo注解

http://www.mossle.com/docs/springsecurity3/html/ns-config.html#ns-minimal 这是3.0的中文文档,写的比较详细,还有<spring in action>最新版也有一章专门是讲这个的.在学习的过程下载了spring security的github上面的demo,其中tutorial-xml是最简单的demo了.在源码里我把里面的一些重要的地方都详细注解了,做个备忘. ps:demo的logout似乎不能用,有bug. 链接:

Spring Security学习总结

1.Spring Security介绍  一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分. 用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户认证一般要求用户提供用户名和密码.系统通过校验用户名和密码来完成认证过程. 用户授权指的是验证某个用户是否有权限执行某个操作.在一个系统中,不同用户所具有的权限是不同的.比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改.一般来说,系统

Spring boot --- Spring Security(二)

   文章部分图片来自参考资料,这篇文章主要讲 spring security  oauth 概述 上一篇我们学习了 SS 中重要的工作原理和几个大概的认证和授权过程.而 spring security oauth 用到的就是 spring security 知识,我们学习 sso 之前先看一下oauth 是什么,可以学习阮一峰老师的文章 oauth 的流程图如下 : (牢牢记住这张图) 主要的角色有资源持有者,资源服务器,认证服务器,还有用户 授权(获取 Access Token)的方式有多种

Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

spring boot以其众多友谊的特性,如零配置.微服务等,吸引了很多的粉丝.而其与Spring Security安全框架的无缝结合,使其具备的安全的特性.在此基础上使用Thymeleaf模板引擎进行渲染,静动态结合,让页面开发更加简单.直观. 通过表单提交登录的用户名和密码是登录接口比较常见的一种设计.在初学的过程中,我也不例外的采用个这种方式.表单设计见下图. 登录成功,完成正常的主页面跳转,这个不存在问题.存在问题的是,登录失败了该咋办呢?我就在考虑,由于thymeleaf的局部刷新操作

Spring Security LDAP简介

1.概述 在本快速教程中,我们将学习如何设置Spring Security LDAP. 在我们开始之前,了解一下LDAP是什么? - 它代表轻量级目录访问协议.它是一种开放的,与供应商无关的协议,用于通过网络访问目录服务. 2. Maven Dependency 首先,让我们看看我们需要的maven依赖项: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spr

Spring Security 解析(二) —— 认证过程

Spring Security 解析(二) -- 认证过程 ??在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security .Spring Security Oauth2 等权限.认证相关的内容.原理及设计学习并整理一遍.本系列文章就是在学习的过程中加强印象和理解所撰写的,如有侵权请告知. 项目环境: JDK1.8 Spring boot 2.x Spring Security 5.x 一.@EnableGlobalAuth