2020.11
1概述
企业级系统应用中,系统的安全可靠性是必须考虑
的,所以企业级Web 应用开发过程中,登录用户的安全认证和权限分配是必不可少的一个设计模块,如果自行开发,必将耗费大量时间,不仅影响开发进度,而且安全性和可靠性不一定得到有效保证。如果使用已有的并经过长期使用证明确实安全有效的组件,则可相应降低软件开发成本,缩短开发周期。在JavaWeb 企业应用开发中,选择Spring Security 来保护Web 应用是一个非常好的选择。Spring Security 是Spring 项目之中的一个安全模块,可以非常方便与Spring 项目无缝集成。特别是在Spring boot 项目中加入Spring security 更是十分简单。
将以一个Web 认证及授权模块为例,详细介绍Spring Security 的技术原理及在Web 应用中的使用。展示如何利用SpringBoot 将Spring Security 整合到SSM 框架的实现过程。
2Spring Security 组件
Spring Security 为基于JavaEE 的企业应用程序提供
一个全面的解决方案,为应用程序提供一个有用的并且高度可配置的安全系统。2.1Spring Security 原理ssm框架实现登录功能
Spring Security 的核心功能主要包括:认证、授权、
攻击防护。其核心就是一组过滤器链,项目启动后将会自动配置。主要过滤器及其原理如图1所示。REST API:相当于应用的controller,用户的增删
改查的一些服务。
Spring Security 过滤器链:这个是最核心的部分,
相当于一组Filter,请求和响应都会经过过滤器。
主要过滤器功能:UsernamePasswordAuthenticationFilter 过滤器:处理表单认证信息。BasicAuthenticationFilter 过滤器:检测和处理http basic 认证。
ExceptionTranslationFilter 过滤器:处理AccessDe⁃niedException 和AuthenticationException 异常。FilterSecurityInterceptor 过滤器:授权处理,最后决
定是否可以访问资源服务。
2.2SpringBoot 整合Spring Security
在早期的Spring Security 版本中需要大量的xml 来
进行配置,而基于SpringBoot 整合SpringSecurity 框架相对而言要好用得多,使用起来相当方便,以上过滤器当系统启动的时候,Spring boot 会自动把它们都配置进去。只需扩展WebSecurityConfigurerAdapter 这个类并重写其中的configure 方法即可以完成上述流程图中过滤器的初始化工作及所有配置。
所以,在SpringBoot 框架中,Spring Security 核心工作就是:
作者简介:朱运乔(1971-),男,副教授,本科,研究方向:数据库系统及应用、软件开发。
基于Spring Security 认证与授权的Web 应用与实现
朱运乔
(湖北职业技术学院,湖北孝感432000)
摘
要:对Spring Security 安全架构作了简单介绍,对其主要工作流程进行了细致分析,并对其实现过程中的关键环节作了重点解析。以一个用户登录认证和授权Web 应用为例,展示了在SpringBoot 框架下整合Spring Security 组件,并以SSM 为整体架构,设计和实现了网站户用的认证和授权过程,为J2EE 企业级应用的系统安全提供了一个可靠的解决方案。
关键词:Spring Security 组件;SpringBoot 框架;SSM 架构;功能实现
图1spring security 过滤器链
Username
Password Authentication
Filter
Basic Authentication
Filter Other Security Filter Exception Transtation Filter
FilterSecurity Interceptor
Rest API
Spring Security 过滤器链
14
2020.11
其一,扩展WebSecurityConfigurerAdapter 类,重写其中的configure 方法进行安全配置,设置认证方式及其相关授权规则;
其二,实现UserDetailsService 接口用于返回用户相关数据。其主要原理是根据username 查询用户实体、获取用户密码及权限,然后跟登录信息对照,以实现数库用户认证和授权过程。该接口实现类的对象在Web⁃SecurityConfigurerAdapter 类中以Javabean 形式被注入其中,被AuthenticationManagerBuilder 参数所引用。
在以下系统的实现过程中,除了介绍系统框架的搭建过程外,也将重点展示以上WebSecurityConfigur⁃erAdapter 类及UserDetailsService 接口的功能扩展和代码实现。
3系统实现
以一个Web 用户登录模块为例,展示如何利用SpringBoot 将Spring Security 整合到SSM 框架,实现登录用户的认证及授权的具体实现过程。3.1添加Spring Security 组件支持
当前项目为SpringBoot 框架项目,除了添加SSM 必
须的starter pom 支持之外,另外还要添加支持Spring Security 的spring-security-boot-starter。3.2数据库设计
在MySQL 数据库中,添加跟登录用户相关的3张表:用户表、角表、授权表,模式表示如下:
用户表:tb_userInfo (id (自增主键),username,pwd)角表:tb_role (id (自增主键),rolename)授权表:tb_userInfo (id (自增主键),userInfoId(外键),roleId (外键))
其中,授权表的两个外键用来维持用户和角的多对多的关系。
3.3项目模块结构组成
项目生成后主要包含的项目模块如图2所示。
SpringBoot 的入口,另外包含spring security 的WebSe⁃curityConfigurerAdapter 派生类WebSecurityCFG,这是spring security 配置关键代码;
射接口包,其中包含有UserInfoMapper、RoleMapper、UserRoleMapper 映射接口,直接在接口上注解映射;ller 为控制器包,包含有控制器,接收前端的request 请求;
类,其中有spring security 的UserDetailsService 实现类,是用户认证和授权的关键代码。3.4关键代码
(1)添加spring security 配置类
SpringBoot 环境下,spring security 的配置不需通过
xml 配置,只须扩展WebSecurityConfigurerAdapter 类并重写configure 方法即可。
@Configuration
public class WebSecurityCFG extends WebSecurity⁃ConfigurerAdapter {
@Bean
protected UserDetailsService userDetailsService(){//添加身份认证的javabean
return new UserDetailsSericeImpl();}
@Bean
PasswordEncoder passwordEncoder(){//添加密码加密的javabean
return new BCryptPasswordEncoder();}
@Override
protected void configure(AuthenticationManager⁃Builder auth)throws Exception {
/
/注入UserDetailsService 和PasswordEncoder 两//个javabean 到auth
auth.userDetailsService(userDetailsService()).
passwordEncoder(passwordEncoder());
}
@Override
图
2
15
2020.11
public void configure (WebSecurity web)throws Exception {
web.ignoring ().antMatchers ("/resources/stat⁃
ic/**");//请求认证时忽略静态资源
}
@Override
protected void configure (HttpSecurity http)
throws Exception {//资源访权限设置
http.authorizeRequests()
//权限设置
.antMatchers("/").permitAll()//请求首页无须
//认证授权
.antMatchers("/admin").hasRole("ADMIN")
//请求该页面用户必须具有“ROLE_ADMIN”角
.
anyRequest().authenticated()
//请求其它页面必须登录认证
.and()
.formLogin()
//认证方式为表单认证
.defaultSuccessUrl("/")
//认证成功返回页面
.and().csrf().disable();
//关闭csrf 防护;
}}
(2)添加身份认证接口UserDetailsService 的实现类Spring Security 通过该类进行身份认证和授权。
public class UserDetailsSericeImpl implements UserDetailsService {
@Autowired //注入用户实体的业务逻辑javabean private UserInfoService userInfoService;
public UserDetails loadUserByUsername (String username)throws UsernameNotFoundException {
//根据提交的username 查询数据库,返回
UserInfo 实体对象
UserInfo userInfo =User⁃
InfoByName(username);
if(userInfo==null)
throw new UsernameNotFoundExcep⁃
tion("username not found!");
List <GrantedAuthority >list =new Ar⁃
rayList<GrantedAuthority>();
for (UserRole User⁃
Roles()){
//遍历并添加用户角名称到授权列表
//list,保存用户角身份
list.add (new SimpleGrantedAuthority
(Role().getRoleName()));
}
String password =Pwd();
//如果表中的密码已加密,则不需下条
//语句
password =new BCryptPasswordEncoder().
encode(password);
UserDetails user=new User(username,pass⁃
word,list);//封装认证信息
return user;}}
以上仅展示了Spring Security 部分功能实现的关键代码,在例中通过SpringBoot 框架将其作为一个模块添加到SSM 项目即可实现用户的登录与授权访问,当然也可以轻添加到类似SSH 等其他架构的项目之中。
4结语
展示了在一个基于SpringBoot 和SSM 框架的WEB
应用项目中,添中Spring Security 安全认证组件,以实现用户的登录与授权访问的实现过程,旨在说明在J2EE 企业级项目中如何使用Spring Security 组件,以更好地解决软件的安全问题。
参考文献
[1]朱运乔.基于SpringBoot+SSM 框架的Web 应用系
统搭建与实现[J].北京:电脑编程技巧与维护,
2019,(10):23-25.
[2]Spring Security 工作原理概览[EB/OL].
[3]Spring Security 入门原理及实战[EB/OL].
[4]汪云飞.JAVA EE 开发的颠覆者SpringBoot 实战
[M].北京:电子工业出版社,2016.
16
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论