接着二讲:之前是安装其源码的原理,在配置类里面,设置角色啊,路径权相匹配什么的, 那么问题来了,那么多用户我不可能手动在配置类一个个hasAnyRole,antMatchers。。。逗号分隔配置吧,想想Spring要一统江湖,也不会那么蠢,肯定有便捷的东西,比如注解
//角色必以ROLE开头 // @Secured("ROLE_tom") 大小写眼科区分角色必以ROLE开头 // //角色必以ROLE开头与否皆可 //@PreAuthorize("hasRole('tom')") 访问资源之前校验 // @PostAuthorize("hasRole('tom')") 访问资源之后校验 @PostMapping("/show") public String show() { return "redirect:show.html"; }
果然有,在某个资源上使用注解,设置权限,@PreAuthorize("hasRole('tom')")全等于@Secured("ROLE_tom"),如果角色和AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal,ROLE_tom,/show.html"));里面的相符合
就可以进行访问
https://www.cnblogs.com/wangbiaohistory/p/16245785.html 里面说了,有各种访问角色,匿名,管理员,认证,记住我这几种授权登录方式,我们来试试登陆后的记住我功能
@Autowired private PersistentTokenRepository persistentTokenRepository; 配置类里面: //记住我 http.rememberMe() .userDetailsService(userDetailsService) .tokenRepository(persistentTokenRepository); /** * springsecurity数据库配置 */ @Configurable @Component public class ConfigSecurity { @Autowired private DataSource dataSource; @Bean public PersistentTokenRepository gePersistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository=new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); //第一次启动要去建表,这里打开,后面再次启动就要关掉,不然会报错 jdbcTokenRepository.setCreateTableOnStartup(true); return jdbcTokenRepository; } }
启动后就会在数据库创建一张表,用于记录最后一次登陆人的标记: CREATE TABLE `persistent_logins` ( `username` varchar(64) COLLATE utf8mb4_general_ci NOT NULL, `series` varchar(64) COLLATE utf8mb4_general_ci NOT NULL, `token` varchar(64) COLLATE utf8mb4_general_ci NOT NULL, `last_used` timestamp NOT NULL, PRIMARY KEY (`series`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='username 用户名\r\nseries 主键\r\ntoken token\r\nlast_used 最后一次登陆时间\r\n';
有人说你怎么知道会自动创建表:jdbcTokenRepository.setCreateTableOnStartup(true);巧不巧,点进去看下哈哈哈,jdbc熟悉的身影有木有
csrf跨站伪造开启 .and().csrf().disable(); 把这行关闭 服务端有源码可知需要传递_csrf.token得值,每次访问必须携带才可以 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试springsecurity</title> </head> <body> <form action="/login" method="post"> <input type="hidden" value="${_csrf.token}" name="_csrf"> 用户名: <input type="text" name="laoliu123" /> 密码: <input type="password" name="laoliu456" /> 记住我: <input type="checkbox" name="remember-me" vaue="true"/> <input type="submit" value="登录"/> </form> </body> </html>