`
hpgary
  • 浏览: 82918 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

初探Spring Security

    博客分类:
  • Java
阅读更多

一、简介

Spring Security是Spring社区的一个顶级项目,也是 Spring Boot官方推荐使用的Security框架。除了常规的 Authentication和Authorization之外,Spring Security还 提供了诸如ACLs,LDAP,JAAS,CAS等高级特性以满足复杂场景下的安全需求

二、理解

1、从AAA说起

【中文名称】:鉴权、授权和计费

【英文名称】:Authentication, Authorization and Accounting

【英文缩写】:AAA

2、Authentication是怎么回事?

在AAA体系中是没有ROLE的,ROLE=ONE Special Authority OR Some Related Authorities Group
 2、Role与Authority

Role=拥有一组权限( Authority/Permission)的某种人(Principle) 

粗粒度的设计1:一种角色就用一个Authority表示,

比如: Authorities={ROLE_ADMIN},

表示管理员角色 Authorities={ROLE_USER},表示普通用户角色

Authorities={ROLE_USER, ROLE_ADMIN},表示双重身份的用户角色

粗粒度的设计2:一种角色就用表示角色本身名字的Authority,以及对应的具体的权限的Authority 来表示,比如: Authorities={ROLE_ADMIN,OP_CreateUser,OP_Drop_User,OP_FrozenUser},表示管理员角色,拥有三种特定的权限 Authorities={ROLE_USER,OP_ChangePassword,OP_List_Reports},表示普通用户角色,有两个权限

3、Spring Security Authentication 

 


 

三、实际使用

1、依赖jar包:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

 2、实现基本登录

@Configuration
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/admin/**")
		.authenticated()
		.and().formLogin().permitAll();
	}

	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("**/js/**", "**/css/**", "**/images/**", "**/**/favicon.ico");

	}

}

 3、jdbc 登录配置

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;

import leader.utils.PasswordHash;

@EnableGlobalMethodSecurity(prePostEnabled = true) //启用全局方法验证
@Configuration
public class JDBCSecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Autowired
	private DataSource datasource ;
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		JdbcTokenRepositoryImpl repository = getTokenRepository() ;
                /*禁用 csrf 验证方式*/
		http.csrf().disable() ; 
                /*登录退出匹配的url*/
		//.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                // 访问 /manager/createuser 时需要op_createuser角色
                // 访问/manager/** 时需要manager角色
		http.authorizeRequests().antMatchers("/manager/createuser").hasAnyRole("op_createuser")
		.antMatchers("/manager/**").hasAnyRole("manager")
		.and().formLogin().permitAll().and() 
                                 /*让浏览器启用记住我,开启后 登录页面 启用记住我按钮*/
				.rememberMe().tokenRepository( repository ).tokenValiditySeconds(31536000).and()
				.logout().permitAll().and(); 
	}
	/**把记住我改成 jdbc链接方式进行验证*/
	public JdbcTokenRepositoryImpl getTokenRepository() {
		JdbcTokenRepositoryImpl r = new JdbcTokenRepositoryImpl();
		r.setDataSource(datasource);
		return r;
	}
	@Override
	public void configure(WebSecurity web) throws Exception {
                /*配置 js css images 等不需要进行登录拦截*/
		web.ignoring().antMatchers("**/js/**", "**/css/**", "**/images/**", "**/**/favicon.ico");

	}
	@Override
	public void configure(AuthenticationManagerBuilder auth) throws Exception {
                /**指定用户登录使用的方式,指定密码加密的方式,这里用 PasswordHash 方式加密,可以自己更改为MD5,或者PBE方式*/
		auth.userDetailsService(jdbcUserDetailsManager()).passwordEncoder(new PasswordEncoder() {
			@Override
			public boolean matches(CharSequence rawPassword, String encodedPassword) {
                                /*验证密码是否正确, rawPassword 登录输入的密码,encodedPassword 是数据库中保存的密码 */
				return ((String)rawPassword).equals(encodedPassword);
			}
			@Override
			public String encode(CharSequence rawPassword) {
                                 /*对注册的密码进行加密*/
				return (String) rawPassword;
			}
		});
	}
        /**启用jdbc 登录,需要创建 user表,表结构在后面给出*/
	public UserDetailsManager jdbcUserDetailsManager() throws Exception {
		JdbcUserDetailsManager userMan = new JdbcUserDetailsManager();
		userMan.setDataSource(datasource);
		userMan.setRolePrefix("ROLE_");
		return userMan;
	}
}

 4、表结构创建

 

DROP TABLE IF EXISTS  users ;

CREATE TABLE users (
  username VARCHAR(20) NOT NULL,
  PASSWORD VARCHAR(150) NOT NULL,
  enabled TINYINT(1) DEFAULT NULL,
  PRIMARY KEY (username)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;

DROP TABLE IF EXISTS authorities;
CREATE TABLE authorities (
  id BIGINT(20) NOT NULL AUTO_INCREMENT,
  username VARCHAR(20) NOT NULL,
  authority VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS persistent_logins ;
CREATE TABLE persistent_logins (
  id INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  username VARCHAR(50) DEFAULT '' COMMENT 'username',
  series VARCHAR(50) DEFAULT '' COMMENT 'series',
  token VARCHAR(64) DEFAULT '' COMMENT 'tokenValue',
  last_used DATETIME DEFAULT NULL COMMENT 'last_used',
  KEY id (id),
  KEY series (series)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
-- user leader , password : 123456
INSERT INTO users(username,PASSWORD,enabled)VALUES('leader' , '123456' , 1) ; 
INSERT authorities(username,authority)VALUES('admin' , 'admin') ;

 

 

  • 大小: 52.3 KB
  • 大小: 210.7 KB
  • 大小: 131.2 KB
  • 大小: 196.6 KB
0
0
分享到:
评论

相关推荐

    1.2 引入SpringSecurity 2. 认证 2.1 登陆校验流程 2.2 原理初探 2.2.1 SpringSecur

    springsecurity1.2 引入SpringSecurity 2. 认证 2.1 登陆校验流程 2.2 原理初探 2.2.1 SpringSecurity完整流程 2.2.2 认证流程详解 2.3 解决问题 2.3.1 思路分析 2.3.2 准备工作 2.3.3 实现 2.3.3.1 数据库校验用户 ...

    Spring security初探

    NULL 博文链接:https://yzxqml.iteye.com/blog/1756106

    SpringBlade 开发手册.pdf

    本手册主要讲解 SpringBlade 的开发手册,包括环境要求、环境准备、基础环境安装、Nacos 安装、Sentinel 安装、Seata 安装、插件安装、工程导入、工程运行、工程测试、开发初探、新建微服务工程、第一个 API、鉴权 ...

    SpringBlade开发手册.pdf

    - **开发初探**:通过一系列实例帮助用户理解SpringBlade的核心功能和使用方式,包括创建微服务工程、API开发等。 ##### 2. 微服务开发实践 - **第一个API**:以一个简单的示例来演示如何创建和使用API,包括API...

    pring初探共18页.pdf.zip

    很抱歉,根据您提供的信息,"pring初探共18页.pdf.zip" 和 "pring初探共18页.pdf." 看起来像是一个关于Spring框架的教程文档,但是具体的文件列表只提到了 "赚钱项目",这与Spring框架的学习内容不直接相关。...

    开源框架 Spring Gossip

    从代理机制初探 AOP 动态代理 &lt;br&gt;AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...

    spring in action 最新

    此外,书中还涉及了Spring Security,帮助开发者理解和实施应用的安全控制。 《Spring in Action》的最新版还可能涵盖了Spring Boot、Spring Cloud等现代Spring生态系统的组件,这些技术极大地简化了Spring应用的...

    2.spring_beginning

    《Spring框架初探》 Spring框架是Java企业级应用开发中的重要组成部分,它以其轻量级、模块化和全面的特性赢得了广大开发者喜爱。本文将深入探讨Spring框架的基础知识,帮助初学者理解并掌握这一强大的工具。 首先...

    spring 课件下载

    在最后一章,我们将探索Spring的一些高级特性,例如Spring Boot用于快速开发,Spring Cloud用于构建分布式系统,以及Spring Security进行权限控制和安全防护。此外,我们还将学习Spring Integration和Spring Batch...

    GWT通信机制初探

    - **安全控制**:Spring的安全框架(如Spring Security)可以与GWT应用集成,提供用户认证和授权功能。 - **数据持久化**:Spring Data JPA或其他ORM工具可以用来处理数据库操作,使GWT应用能方便地访问后端数据。 ...

    spring-boot-1

    这个名为"spring-boot-1"的项目很可能是对Spring Boot的初探或者是某个特定版本的示例代码库。虽然没有提供具体的标签,我们可以根据Spring Boot的核心特性来探讨相关的知识点。 1. **Spring Boot基础**: Spring ...

    java8源码-tp-practice:千里之行,始于足下

    OAuth2.0初探 学习编写 REST 接口测试用例 学习自定义 validator 学习自定义 filter 学习自定义 interceptor 自定义 aspect 学习 REST 接口多线程编程 Thread#start Thread#stop spring boot 1.5.20.RELEASE spring ...

    网上购物系统的设计与开发初探(硕士毕业论文)

    JSP和Servlet可以结合过滤器、安全框架(如Spring Security)来防止SQL注入、XSS攻击等,同时,系统需要保护用户的隐私数据,如使用HTTPS协议加密传输,以及对敏感操作进行身份验证和权限控制。 总的来说,这篇论文...

    java网上商城的初期模板,仅供参考

    Spring Security提供了一套完整的安全解决方案,包括用户认证、权限控制等功能。 四、购物车与订单处理 1. **购物车实现**:购物车通常通过Session来存储用户选择的商品,当用户确认购买时,将购物车中的商品转化...

    源码shoot10.17.rar(0积分下载)

    同时,配合Spring Security,可以实现权限控制和用户认证,为应用提供安全的访问环境。在这个项目中,我们可能会看到如何定义控制器处理HTTP请求,以及如何通过模型视图来传递数据到前端页面。 接下来,密码的安全...

    sms_0.1.rar_family8x8_java_www.sms 1188.com

    安全性方面,Apache Shiro或Spring Security可能被用来处理用户认证和授权,确保系统安全。 总的来说,"sms_0.1.rar"是一个基于Java开发的学生管理系统,可能具备一套完整的用户管理和教学管理功能,其设计简洁,...

    JEECG 快速开发指南

    - **权限管理**:集成Spring Security或Shiro,实现细粒度的权限控制。 - **工作流引擎**:可能集成Activiti或Flowable,支持业务流程的建模和执行。 - **数据源管理**:支持多数据源配置,便于数据隔离和分布式部署...

    Java-Handelsportal-:Java Handelsportal,首次GitHub测试

    6. **安全性**:考虑到电子商务涉及敏感的用户信息和交易数据,项目可能会采用Spring Security或者Apache Shiro等安全框架,实现身份验证、授权和加密等功能,确保系统安全。 7. **测试与持续集成**:在GitHub上的...

Global site tag (gtag.js) - Google Analytics