热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot2.0.5简单整合SpringSecurity遇到的坑

SpringBoot2.0.5简单整合SpringSecurity遇到的坑,Go语言社区,Golang程序员人脉社

SpringBoot整合Security的博客案例网上已经很多了,但个人觉得对于一个初次整合Security的同学来说,一个简单的案例还是很有必要的。为此,上传一个本人整合的案例,仅供大家参考,也为自己记录一下,话不多说,表演开始。

版本介绍:SpringBoot 2.0.5,JDK 1.8

首先创建SpringBoot项目,能看到这里的同学,相信这一步就不用多说了,可以使用Eclipse中的Spring插件创建,简单又省事。

引入依赖:



	4.0.0

	com.peng.demo
	SpringBoot-security
	0.0.1-SNAPSHOT
	jar

	SpringBoot-security
	SpringBoot-security

	
		org.springframework.boot
		spring-boot-starter-parent
		2.0.5.RELEASE
		 
	

	
		UTF-8
		UTF-8
		1.8
	

	
		
			org.springframework.boot
			spring-boot-starter-security
		
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.springframework.boot
			spring-boot-starter-test
			test
		
		
			org.springframework.security
			spring-security-test
			test
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	



创建认证类,用于认证用户

public class UserDetailsServiceImpl implements UserDetailsService {
	
	@Reference
	private UserService userService;
	
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		//构建角色
		List authorities=new ArrayList();
		authorities.add(new SimpleGrantedAuthority("ADMIN"));
		//查询用户
		TbUser tbUser = userService.findOne(username);
		if (tbUser!=null) {
			if (tbUser.getStatus().equals("1")) {
				return new User(username,tbUser.getPassword(), authorities);
			}else{
				return null;
			}
		}else{
			return null;
		}
	}

}

注:本人在实现本案例的时候,SpringBoot已整合Dubbo,所以其中的UserService是操作用户的service,读者可自己实现,通过查询数据库,返回用户对象。@Reference注解为Dubbo中注解,读者可用@Autowired代替。loadUserByUsername方法中的参数为页面表单中输入的参数值,后台拿到username,通过userService查询数据库,即可判断用户是否存在。返回User对象,即可为用户授权,其中的authorities为用户的角色列表,这个角色列表也可以从数据库中查询出来,具体咋实现,可根据业务进行表设计。

注:SprintBoot2.0.5整合Security时,登录密码需要进行编码,所以在授权时,从数据库中查询的登录密码需要经过编码的,如果不进行编码,需要注入

@Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

返回的User为,对登陆密码进行编码:

return new User(username,bCryptPasswordEncoder.encode(tbUser.getPassword()), authorities);

创建WebSecurityConfigurerAdapter的实现,配置Security

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		//配置用户名及密码及角色
		auth.userDetailsService(userDetailsServiceImpl()).passwordEncoder(bCryptPasswordEncoder());
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		//配置拦截规则----配置访问所有地址均需要ADMIN权限,使用内存用户使用hasAnyRole验证用户角色,使用数据库用户,使用hasAnyAuthority验证用户权限
		http.authorizeRequests().antMatchers("/**").hasAnyAuthority("ADMIN");
		
		//配置登录页面及退出等相关页面
		http.formLogin().loginPage("/login.html")//登录页面
		.usernameParameter("username").passwordParameter("password")//配置用户名密码参数名称
		.loginProcessingUrl("/login")//配置登录请求路径
		.defaultSuccessUrl("/admin/index.html",true)//登录成功跳转,并且始终跳转到/admin/index.html
		.failureUrl("/login.html")//登录失败跳转
		.and().logout().logoutUrl("/logout")//退出登录访问地址
		.logoutSuccessUrl("/login.html")//退出成功后访问页面
		.and().csrf().disable()//配置不进行csrf拦截
		.headers().frameOptions().sameOrigin();//配置可以加载框架页面  如iframe
	
		//自动登录
		http.rememberMe()
		.tokenValiditySeconds(432000);//设置COOKIE保存时间 单位秒
	}
	
	@Override
    public void configure(WebSecurity web) throws Exception {
        //解决静态资源被拦截的问题
        web.ignoring().antMatchers("/*.html","/css/**","/img/**","/js/**");
    }
	
	
	@Bean
	public BCryptPasswordEncoder bCryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}
	
	@Bean
	public UserDetailsServiceImpl userDetailsServiceImpl() {
		return new UserDetailsServiceImpl();
	}
	
}

 

注:网上看到很多博客写到该配置时都会在当前配置的类头上在加一个@Configuration注解,其实是没必要的,查看@EnableWebSecurity注解源码,即可查看到其实已经配置@Configuration注解啦。在当前配置类中使用@Bean注解向IOC容器中加入密码加密组件及我们自己配置的用户认证组件,重写WebSecurityConfigurerAdapter的三个方法,配置自己的登录及拦截规则,具体解释代码中已有注释。

注:Security也可以配置内存中的用户名及密码,当使用内存用户名及密码时,配置拦截规则可以为:http.authorizeRequests().antMatchers("/**").hasRole("ADMIN");

但使用数据库中的用户名及密码通过GrantedAuthority设置角色时,配置拦截规则为:

http.authorizeRequests().antMatchers("/**").hasAnyAuthority("ADMIN");

这是一个坑,使用错误就会一直提示没有权限

编写登录页面login.html








	
		

自动登录

注:登录方式为post提交,提交地址为/login

编写/admin/index.html








	登陆成功退出登陆

到此,SpringBoot整合Security就完成了,水平有限,如有错误,希望留言修正。

 


推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
author-avatar
飞天6585_439
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有