image
image
image


来看具体例子中shiro的应用:
首先 三个核心组件

  1. Subject 当前和软件交互的任何事件
  2. SecurityManager 管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞
  3. Realms:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据 在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)

下面一个例子
用mybatis数据库储存用户信息 然后通过shiro
可以认证授权 对应用户对应显示跳转页面

首页面:
<!DOCTYPE html>
这里的用的语法就是thymeleaf 和shiro结合thymeleaf
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这个用来没登陆就显示登录 登录了就不显示 通过 session储存的
<h2 th:if="${session.success==null}">
<a th:href="@{/user/login}">登录</a>
</h2>
是否拥有权限 此处的user:add 对应的就是数据表中的perms
拥有参数访问权限
<div shiro:hasPermission="user:add">
<a th:href="@{/user/add}">add</a>
</div>
<br>
<div shiro:hasPermission="user:update">
<a th:href="@{/user/update}">update</a>
</div>
<br>
<div shiro:hasPermission="user:delete">
<a th:href="@{/user/delete}">delete</a>
</div>
</body>
</html>
跳转的登陆页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
显示个信息是否登录了
<p th:text="${msg}" style="color: rebeccapurple"></p>
form表单提交信息
<form th:action="@{/subject}">
用户名:<input name="username"><br>
密码:<input name="pwd"><br>
<input type="submit" placeholder="提交">
</form>
</body>
</html>
controller层中接受form表单提交信息
@RequestMapping("/subject")
public String subject(String username, String pwd, Model model) {
//获取当前用户
//SecurityUtils是一个抽象的工具类,它主要用于执行安全相关的操作,并简化框架的使用
Subject subject = SecurityUtils.getSubject();
//封装用户登录数据 标记
UsernamePasswordToken token = new UsernamePasswordToken(username, pwd);
try {
subject.login(token);
return "user/First"; //成功标记跳转首页
} catch (UnknownAccountException e) {
//用户不存在
model.addAttribute("msg", "用户名错误");
return "user/login";
} catch (IncorrectCredentialsException e) {
//密码错误
model.addAttribute("msg", "密码错误");
return "user/login";
}
springmvc config配置
此处就是配置了个过滤器
@Configuration
public class ShiroConfig {
//过滤器
// shiroFilterFactoryBean是整个Shiro的入口点,用于拦截需要安全控制的请求进行处理
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager); //Shiro内置过滤器
/**
* anon 无需认证
* authc 需要登陆
* user 必须存在用户
* roles 角色
* perms 拥有参数访问权限
* */
Map<String, String> filterLinkedHashMap = new LinkedHashMap<>();
filterLinkedHashMap.put("/user/delete", "perms[user:delete]");
// perms对应数据表字段
filterLinkedHashMap.put("/user/add", "perms[user:add]");
filterLinkedHashMap.put("/user/update", "perms[user:update]");
filterLinkedHashMap.put("/user/*", "authc");
//setFilterChainDefinitionMap方法是ShiroFilterFactoryBean`类的一个方法,用于设置过滤器链定义映射 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterLinkedHashMap);
//未授权跳转
shiroFilterFactoryBean.setUnauthorizedUrl("/Noauth");
//需要登陆的页面跳转到login.html页面
shiroFilterFactoryBean.setLoginUrl("/login");
return shiroFilterFactoryBean;
}
重点重点
//安全管理器
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//关联userRealm
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
//关联一个自定义的Realm
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
@Bean
//整合thymeleaf和shiro
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
UserRealm
//自定义的Realm 本质上是一个特定的安全 DAO
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Subject subject = SecurityUtils.getSubject();
User principal = (User) subject.getPrincipal();
info.addStringPermission(principal.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token;
//配合数据库
这里就是调用了mapper中service层
User user = userService.query(usernamePasswordToken.getUsername());
if(user==null){
return null;
}
// 这个就是登陆后 session储存
Subject successsor = SecurityUtils.getSubject();
Session session = successsor.getSession();
session.setAttribute("success",user);
//密码认证 shiro会做
//SimpleAuthorizationInfo对象可以添加角色和字符串权限
// 然后这些角色和权限会被用于判断用户是否有权限执行特定的操作或访问特定的资源
//Object principal, Object credentials, String realmName 三个参数
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}

image

posted on   不爱美女爱辣条  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?



点击右上角即可分享
微信分享提示