Springboot整合shiro_springboot shiro,2024年最新网络安全初级开发是如何一步步成为高级开发

jakarta
1.11.0

org.apache.shiro shiro-core org.apache.shiro shiro-web org.apache.shiro shiro-core jakarta 1.11.0 org.apache.shiro shiro-web jakarta 1.11.0 org.apache.shiro shiro-core mysql mysql-connector-java 8.0.24 com.baomidou mybatis-plus-boot-starter 3.5.3.1 com.github.theborakompanioni thymeleaf-extras-shiro 2.0.0 org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok

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、认证和授权规则

认证过滤器

  1. anon:无需认证。
  2. authc:必须认证。
  3. authcBasic:需要通过HTTPBasic认证。
  4. user:不一定通过认证,只要曾经被Shiro记录即可,比如:记住我。

授权过滤器

  1. perms:必须拥有某个权限才能访问。
  2. role:必须拥有某个角色才能访问。
  3. port:请求的端口必须是指定值才可以。
  4. rest:请求必须基于RESTful,POST,PUT,GET,DELETE。
  5. ssl:必须是安全的URL请求,协议HTTP。

6、Shiro整合Thymeleaf

1、pom.xml引入依赖

com.github.theborakompanioni thymeleaf-extras-shiro 2.0.0

2、配置类添加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”);
//设置加密次数
credentialsMatcher.setHashIterations(1);
//在身份验证过程中,用户提供的凭证(如密码)需要与存储在系统中的凭证进行匹配,以验证用户的身份。凭证匹配器(Credentials Matcher)是用来执行此匹配过程的组件
accountRealm.setCredentialsMatcher(credentialsMatcher); //配置身份验证领域(Realm)的凭证匹配器

return accountRealm;
}

3、 Realm

在认证方法返回对象中加入第三个参数

return new SimpleAuthenticationInfo(account,account.getPassword(), ByteSource.Util.bytes(account.getSalt()),getName());

4、产生盐

//SecureRandomNumberGenerator 是一个类,它是 Apache Shiro 库中用于生成安全的随机数的类。它使用加密强度较高的算法来生成随机字节。.nextBytes().toHex()是一个用于生成随机字节序列并转换为十六进制字符串的代码片段

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**

需要完整版PDF学习资源私我

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Kf3NayUe-1712717410514)]

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值