- Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架
- 简而言之,他是个框架,而且很牛逼
- 作用:保护基于Spring的应用程序的实际标准,致力于为Java应用程序提供身份验证和授权
- pring Security的真正强大之处在于可以轻松扩展以满足自定义要求.
- 认证: 用户登录, 用来判断当前登录的用户是谁
- 授权:判断当前用户有什么权限
- 安全防护:防止跨站请求,session攻击等
用户登录, 传统基于web开发的项目的登录功能.
用户授权, 在系统中用户拥有哪些操作权限
单一登录, 一个账号只能在同一时间只能在一个地方进行登录, 如果在其他地方进行第二次登录,则剔除之前登录操作
?1.,引入依赖
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.6.3</version> </dependency>
2,编写配置类
package com.itheima.config; import com.itheima.controller.backend.security.SpringSecurityUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 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.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; /** * Security配置类 */ @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { /** * http请求处理方法 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin()// 开启表单认证 .loginPage("/backend/login.html")// 自定义登录页面 .loginProcessingUrl("/login")// 登录处理Url .usernameParameter("username").passwordParameter("password")// 修改自定义表单name值. .defaultSuccessUrl("/backend/pages/main.html")// 登录成功后跳转路径 .and() .authorizeRequests() .antMatchers("/backend/login.html").permitAll() //放行登录界面 .anyRequest().authenticated(); //所有请求都需要登录认证才能访问; // 关闭csrf防护 http.csrf().disable(); // 允许iframe加载页面 http.headers().frameOptions().sameOrigin(); } /** * 放行静态资源 * @param web * @throws Exception */ @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/backend/css/**", "/backend/img/**", "/backend/js/**", "/backend/plugins/**", "/favicon.ico"); } @Autowired private SpringSecurityUserService userService; @Bean protected PasswordEncoder myPasswordEncoder(){ return new BCryptPasswordEncoder(); } /** * 身份验证管理器 * * @param auth * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(myPasswordEncoder());// 使用自定义用户认证 } }
1),service层?基于数据库实现认证功能
实现security的一个UserDetailsService接口, 重写这个接口里面loadUserByUsername
package com.boxuegu.service.impl; import com.boxuegu.domain.User; import com.boxuegu.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; /** * 基于数据库中完成认证 */ @Service public class MyUserDetailsService implements UserDetailsService { @Autowired UserService userService; /** * 根据username查询用户实体 * * @param username * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userService.findByUsername(username); if (user == null) { throw new UsernameNotFoundException(username);// 用户名没有找到 } // 先声明一个权限集合, 因为构造方法里面不能传入null Collection<? extends GrantedAuthority> authorities = new ArrayList<>(); // 需要返回一个SpringSecurity的UserDetails对象 UserDetails userDetails = new org.springframework.security.core.userdetails.User(user.getUsername(), "{noop}" + user.getPassword(),// {noop}表示不加密认证。 true, // 用户是否启用 true 代表启用 true,// 用户是否过期 true 代表未过期 true,// 用户凭据是否过期 true 代表未过期 true,// 用户是否锁定 true 代表未锁定 authorities); return userDetails; } }