mybatis-plus-boot-starter
3.5.3.1
2、自定义Shiro过滤器
public class AccountRealm extends AuthorizingRealm {
@Autowired
private AccountService accountService;
/**
- 授权
- @param principalCollection
- @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取当前登录的用户信息
Subject subject = SecurityUtils.getSubject();
Account account = (Account) subject.getPrincipal();
//设置角色
Set roles = new HashSet<>();
roles.add(account.getRole());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
//设置权限
info.addStringPermission(account.getPerms());
return info;
}
/**
- 认证
- @param authenticationToken
- @return
- @throws AuthenticationException
/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; //这行代码将传入的 authenticationToken 转换为 UsernamePasswordToken 对象,以便获取用户名和密码。
Account account = accountService.findByUsername(token.getUsername());
if(account != null){
/* - 这是返回身份验证信息的代码。SimpleAuthenticationInfo 是 Shiro 框架中的一个实现类,用于封装用户的身份验证信息
- @Param1 account 参数表示身份验证的主体对象,可以是任何表示用户身份的实体对象
- @Param2 表示用户的密码,用于进行密码验证
- @Param3 返回当前 Realm 的名称,用于标识身份验证信息来源,Realm 可以通过其名称进行唯一标识,以便在 Shiro 配置文件中区分和配置不同的 Realm
*/
return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
}
return null;
}
}
3、配置类
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//权限设置
Map<String,String> map = new HashMap<>();
map.put(“/main”,“authc”);
map.put(“/manage”,“perms[manage]”);
map.put(“/administrator”,“roles[administrator]”);
//设置登录页面
factoryBean.setLoginUrl(“/login”);
//设置未授权页面
factoryBean.setUnauthorizedUrl(“/unauth”);
factoryBean.setFilterChainDefinitionMap(map);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(AccountRealm accountRealm){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(accountRealm);
return manager;
}
@Bean
public AccountRealm accountRealm(){
return new AccountRealm();
}
5、认证和授权规则
认证过滤器
- anon:无需认证。
- authc:必须认证。
- authcBasic:需要通过HTTPBasic认证。
- user:不一定通过认证,只要曾经被Shiro记录即可,比如:记住我。
授权过滤器
- perms:必须拥有某个权限才能访问。
- role:必须拥有某个角色才能访问。
- port:请求的端口必须是指定值才可以。
- rest:请求必须基于RESTful,POST,PUT,GET,DELETE。
- ssl:必须是安全的URL请求,协议HTTP。
6、Shiro整合Thymeleaf
1、pom.xml引入依赖
com.github.theborakompanioni thymeleaf-extras-shiro 2.0.02、配置类添加ShiroDialect
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
3、 配置视图解析器
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
4、 html
xmlns:th=“http://www.thymeleaf.org” //加上这个才可以使用thymeleaf语法
xmlns:shiro=“http://www.thymeleaf.org/thymeleaf-extras-shiro” //加上这个就可以使用shiro表达式了
//加入这个可以解决控制台报错icon的问题
7、Controller示例
@Controller
public class AccountController {
@GetMapping(“/{url}”)
public String redirect(@PathVariable(“url”) String url){
return url;
}
@PostMapping(“/login”)
public String login(String username, String password,Model model){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
// token.setRememberMe(rememberMe);
try {
subject.login(token);
Account account = (Account) subject.getPrincipal();
subject.getSession().setAttribute(“account”,account);
return “index”;
} catch (UnknownAccountException e) {
e.printStackTrace();
model.addAttribute(“msg”,“用户名错误!”);
return “login”;
} catch (IncorrectCredentialsException e) {
e.printStackTrace();
model.addAttribute(“msg”,“密码错误!”);
return “login”;
}
}
@GetMapping(“/unauth”)
@ResponseBody
public String unauth(){
return “未授权,无法访问!”;
}
@GetMapping(“/logout”)
public String logout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return “login”;
}
}
8、权限管理标准5张表
这个去网上随便搜下,就可以看到一些案例表!
9、密码加密、加盐
1、什么是加盐?
加盐的意思就是加上 安全随机数
2、ShiroConfig
@Bean
public AccountRealm accountRealm(){
AccountRealm accountRealm = new AccountRealm();
//设置加密算法
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher(“md5”);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
850783)]
[外链图片转存中…(img-v0auICNg-1712547850783)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-Uc5hSABr-1712547850783)]