Spring Security
Spring Security简介#
历史#
添加parent和web依赖
SpringBootApplication
@MapperScan
@SpringBootApplication public class SpringSecurityApplication{ public static void main(String[] args){ SpringApplication.run(SpringSecurityApplication.class, args); } }
MyTest
SpringBootTest(classes = SpringSecurityApplication.class) @RunWith(SpringJUnit4ClassRunner.class) public class MyTest{ @Test public void test(){ PasswordEncoder encoder = new BCryptPasswordEncoder(); String result = encoder.encode("pwd"); System.out.println(result);
boolean match = encode.matches("pwd", result);
System.out.println(match); } }
DemoController
@Controller public class DemoController{ @RequestMapping("/"); @ResponseBody public String demo(){ return "demo"; } }
添加依赖,官方地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
进入http://localhost:8080/login.html
UserDetailService详解#
public interface UserDetailService{ UserDetails loadUserByUserName(String var1) throws UsernameNotFoundException; }
接口方法
UserDetailServiceimpl
@Service public class UserDetailsServiceImpl implements UserDetailsService{ @Autowired private PasswordEncoder passwordEncoder; @Overrride public UserDetails loadUserByUserName(String username) throws UsernameNotFoundException{ if(!username.equals("admin")){ throw new UsernameNotFoundException("用户不存在!"); } // 从数据库中获取密码 String password = "pwd"; String encodePassword = PasswordEncoder.encode(password); UserDetails userDetails = new User(username, encodePassword, AuthorityUtils.commaSeparatedStringToAuthorityList("admin1, admin2")); return userDetails; } }
SecurityConfig
@Configuration public class SecurityConfig{ @Bean protected PasswordEncoder passwrodEncoder(){ return new BCryptPasswordEncoder(); } }
连接数据库实现自定义逻辑#
UserMapper
public interface UserMapper{ public User selectByUserName(String username); }
application.yml
spring:
datasource:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
mybatis:
mapper-locations: classpath:mybatis/*.xml
UserMapper.xml
<mapper namespace="com.test.mapper.UserMapper"> <select id="selectByUsername" resultType="com.test.pojo.User"> select id, username, password from t_user where username = #{param} </select> </mapper>
注解@Secured的使用#
在启动类中添加注解
@EnaleGlobalMethodSecurity(securedEnabled = true)
在controller中添加注解
@Secured("ROLE_ADMIN")
ConfigureAdapter中添加
.antMatchers("/demo").permitAll()
@PreAuthorize/@PostAuthorize#
启动类
@EnaleGlobalMethodSecurity(prePostEnabled = true)
controller
@PreAuthorize("hasAuthority('demo:update')")
Remember me功能实现#
添加mybatis依赖,官方地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>
添加mysql依赖,官方地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
配置数据源#
applicaiton.yml
spring:
datasource:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
mybatis:
mapper-locations: classpath:mybatis/*.xml
RememberMeConfig
@Configuration public class RemeberMeConfig{ @Autowired private Datasource dataSource; @Bean protected PersonTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcToeknRepositoryImpl(); jdbcTokenRepository.setCreateTableOnStartup(true); jdbcTokenRepository.setDataSource(dataSource); return jdbcTokenRepository; } }
WebSecurityConfigureAdapter
@Autowire private PersistentTokenRepository persistentTokenRepository;
修改SecurityConfig
http.rememberMe() .userDetailsSevice(userDetailsService)// 登录逻辑对象 .tokenValiditySeconds(10)// 设置有效时间 .tokenRepository(persistentTokenRepository);// 持久层对象
在客户端页面添加复选框
添加依赖,官方地址:https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5
<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5 --> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>3.0.4.RELEASE</version> </dependency>
添加依赖,官方地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>2.3.4.RELEASE</version> </dependency>
获取属性#
退出登录#
MyWebSecurityconfigurerAdapter
http.logout() .logoutSuccessUrl("/showLogin") .logoutUrl("/test") .logoutSuccesshandler(new LogoutSuccessHandler(){ @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse httpServletResponse, Authentication authentication) throws Exception{} })
Spring Security中的CSRF详解#
@SpringBootApplication public class CsrfApplication{ public static void main(STring[] args){ SpringApplication.run(CsrfApplication.class, args); } }
application.ymml
server:
port: 8081
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/14397571.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-02-14 三大抽样分布
2020-02-14 统计量
2020-02-14 总体、个体和简单随机样本