SpringBoot+SpringSecurity快速入门
目录
简介
快速开始
二、基于管理员模块SpringSecurity快速开始
2.0、首先引入依赖
2.1、继承WebSecurityConfiuraerAdapter
2.2、前端页面
三、基于普通用户模块SpringSecurity快速开始
3.0、引入依赖
3.1、实现 UserDetaiilsService接口
3.2、继承WebSecurityconfiuraerAdapter
3.3、前端页面
简介
在SpringBoot 2.3.4.RELEASE中集成了SpringSecurity,所以我们只需要引入启动依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的
成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方
案。
正如你可能知道的关于安全方面的两个主要区域是“ 认证 ”和“ 授权 ”(或者访问控
制),一般来说,Web 应用的安全性包括 用户认证(Authentication)和用户授权
(Authorization) 两个部分,这两点也是 Spring Security 重要核心功能。
(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问
该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认
证过程。 通俗点说就是系统认为用户是否能登录
(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户
所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以
进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的
权限。 通俗点讲就是系统判断用户是否有权限去做某些事情
快速开始
使用SpringSecurity的快速开始分为两步讲解,因为在公司写项目的过程中,分为前台和后台,而在后台使用登录时,是不需要查询数据库的,因为后台登录是管理员控制,而管理员只需要1~5个即可。在前台我们就需要查询数据库了,所以我将快速开始分为两个模块,一个为后台模块,一个为前台模块
二、基于管理员模块SpringSecurity快速开始
2.0、首先引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.1、继承WebSecurityConfiuraerAdapter
WebSecurityConfigurerAdapter
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String password = passwordEncoder().encode("密码");
auth.inMemoryAuthentication().withUser("账号").password(password).roles("");
}
//引入security自带的密码加密
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//配置认证
http.formLogin().loginPage("/login.html")//配置那个url为登录页面
.loginProcessingUrl("/login")//设置那个是登录的url
.defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
.failureForwardUrl("/find.html").permitAll()//登录失败去哪?
//退出时删除缓存,并且重定向到login.html页面 在前端默认路径为:/logout .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
//开启frame功能
http.headers().frameOptions().sameOrigin();
//这个可以根据自己需求去添加
http.authorizeRequests().antMatchers(
"/css/**",
"/*.html",
"/img/**",
"/js/**",
"/login",
"/plugins/**"
).permitAll()//制定URL无需保护。
.anyRequest() //其他请求
.authenticated();//需要认证
//关闭csrf跨域
http.csrf().disable();
}
}
2.2、前端页面
<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>
注意:name必须叫:**username 和**password method必须为**post提交 action为:/login**
配置完成之后就可以启动项目开始测试了,不管访问什么都会默认到你指定的登录页面,只有登录成功之后才可以访问其他页面!
三、基于普通用户模块SpringSecurity快速开始
3.0、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3.1、实现 UserDetaiilsService接口
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
/**
因为公司项目使用的是Dubbo+zookeeper组合,所以我调用的接口在zookeeper中使用这个注解
如果你使用的是单项目的话可以直接通过spring注入的方式,来获取你的mapper接口!
*/
@Reference(version = "1.0.0")
SellerService sellerService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//给当前用户创建权限 可自定义 默认就为这个
List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_SELLER");
//通过前端传入的参数获取username,在数据库中查询出来数据
Seller seller = sellerService.findOne(username);
//这个是判断用户的状态,如果没有状态,你只需要判断是否为空即可
if (seller!=null && "1".equals(seller.getStatus())){
return new User(seller.getSellerId(),new BCryptPasswordEncoder().encode(seller.getPassword()),auths);
}else {
throw new UsernameNotFoundException("用户名不存在");
}
}
}
3.2、继承WebSecurityconfiuraerAdapter
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//通过数据库查询出来判断账号密码是否相等
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
//注入security自带的加密方式
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//配置认证
http.formLogin().loginPage("/shoplogin.html")//配置那个url为登录页面
.loginProcessingUrl("/login")//设置那个是登录的url
.defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
.failureForwardUrl("/shoplogin.html").permitAll()//登录失败去哪?
.and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
// 解析前端的 <frame>、<iframe> 标签
http.headers().frameOptions().sameOrigin();
//设置无需保护的路径
http.authorizeRequests().antMatchers(
"/css/**",
"/img/**",
"/js/**",
"/login",
"/plugins/**",
"/seller/addSeller",
"/*.html"
).permitAll()//制定URL无需保护。
.anyRequest() //其他请求
.authenticated();//需要认证
//关闭跨域
http.csrf().disable();
}
}
此图片就是上边代码中的内容,可以忽略
3.3、前端页面
<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>
3.4、获取被Security管理的用户名
@RequestMapping("/name")
public Map<String,String> name(){
//获取被Security管理的username
String name= SecurityContextHolder.getContext().getAuthentication().getName();
//将他保存到map等其他类型中就可以传到前端页面或者通过这个名字查询数据库
Map<String, String> map = new HashMap<>();
map.put("loginName",name);
return map;
}
可以进行测试啦
请求链:
当我们启动项目的时候会自动加载3.2中的 configure(HttpSecurity http)方法,然后当我们进入登录页,通过username,password提交post请求数据到/login时,会进入3.1中loadUserByUsername(String username)方法,来进行你数据库之间的判断,判断结束后会进入3.2中的configure(AuthenticationManagerBuilder auth) 方法,交给Security处理是否登录成功
还没有评论,来说两句吧...