环境搭建见上篇:SpringBoot整合Shiro 一:搭建环境

Shiro配置类配置

shiro的配置主要集中在 ShiroFilterFactoryBean

关于权限:

  anon:无需认证就可以访问

​  authc:必须认证了才能访问 ​

  user:必须用有了 记住我 功能才能用 ​

  perms:拥有对某个资源的权限才能访问 ​

  role:拥有某个角色权限才能访问

1、登录拦截

ShiroConfigShiroFilterFactoryBean

  给控制器添加2个 "必须认证了才能访问"

   也就是使用 authc

@Bean(name = "shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);

/*
* anon:无需认证就可以访问
* authc:必须认证了才能访问
* user:必须用有了 记住我 功能才能用
* perms:拥有对某个资源的权限才能访问
* role:拥有某个角色权限才能访问
*/
Map<String ,String> filterMap = new LinkedHashMap<>();

filterMap.put("/user/add","authc");
filterMap.put("/user/update","authc");

bean.setFilterChainDefinitionMap(filterMap);

return bean;
}

访问测试

点击 addupdate

都出现这个404页面

2、添加登录页面

登录页面

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<h1>登录</h1>
<hr>

<form action="">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<p><input type="submit"></p>
</form>

</body>
</html>

对应controller

 @RequestMapping("/toLogin")
public String toLogin(){
return "login";
}

shiro配置类

  1.add 与 update 跳转合并

    filterMap.put("/user/*","authc");

  2.添加一个登录跳转

    bean.setLoginUrl("/toLogin");

@Bean(name = "shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);

/*
* anon:无需认证就可以访问
* authc:必须认证了才能访问
* user:必须用有了 记住我 功能才能用
* perms:拥有对某个资源的权限才能访问
* role:拥有某个角色权限才能访问
*/
Map<String ,String> filterMap = new LinkedHashMap<>();

filterMap.put("/user/*","authc");

bean.setFilterChainDefinitionMap(filterMap);

bean.setLoginUrl("/toLogin");

return bean;
}

测试

点击 addupdate

出现登录页面

3、认证

controller中

  1.获取当前的用户

     Subject subject = SecurityUtils.getSubject();

  2.封装用户的登录数据

     UsernamePasswordToken token = new UsernamePasswordToken(username, password);

  3.执行登录方法,如果没有异常说明OK

    subject.login(token);

  4.对应异常

    UnknownAccountException:用户名不存在

    IncorrectCredentialsException:密码错误

@RequestMapping("/login")
public String login(String username, String password, Model model) {

//获取当前的用户
Subject subject = SecurityUtils.getSubject();

//封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);

try {
subject.login(token); //执行登录方法,如果没有异常说明OK
return "index";
} catch (UnknownAccountException e) { //用户名不存在
model.addAttribute("msg", "用户名错误");
return "login";
} catch (IncorrectCredentialsException e) { //密码错误
model.addAttribute("msg", "密码错误");
return "login";
}

}

认证具体任务

UserRealm 中 doGetAuthenticationInfo

先将数据写死测试

只需判断用户名,密码shiro判断

//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了=>认证doGetAuthenticationInfo");

//用户名+密码
String name = "root";
String password="123";

UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

if (!token.getUsername().equals(name)){
return null; //return null 会自动抛出异常
}

//密码认证,shiro做
return new SimpleAuthenticationInfo("",password,"");
}

login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<h1>登录</h1>
<hr>

<form th:action="@{/login}">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<p><input type="submit"></p>
</form>

<p th:text="${msg}" style="color: red"></p>

</body>
</html>

测试

用户名错误

密码错误

都正确

访问add

访问update

最新文章

  1. ASP.NET MVC5 ModelBinder
  2. Find linux下
  3. Ajax最详细的参数解析和场景应用
  4. 从一个QQ群友那儿偷来的js图形 ^_^
  5. Eclipse安装配置PyDev插件
  6. Lucene基础(四)-- 结合数据库使用
  7. 【剑指offer】面试题39:二叉树的深度
  8. IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度
  9. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: &amp;#39;L
  10. HTTP架构介绍(1) Web服务器和代理服务器
  11. Swift中如何化简标准库中冗长的类实例初始化代码
  12. JavaScript中编码函数escape,encodeURI,encodeURIComponent
  13. springboot整合JPA(简单整理,待续---)
  14. HTTP 方法:Get与Post分析
  15. Java程序员的成长之路
  16. Ubuntu16.04配置静态IP地址
  17. 查询sql数据库中表占用的空间大小
  18. Mod制作第一个物品
  19. spring context 继承
  20. Asp.net WebAPi Restful 的实现和跨域

热门文章

  1. Noip模拟20 2021.7.19
  2. Noip模拟14 2021.7.13
  3. IC封装的热特性
  4. 洛谷 P5657 [CSP-S2019] 格雷码
  5. linux中的strip命令简介
  6. 羽夏看Win系统内核——SourceInsight 配置 WRK
  7. 从0到1使用Kubernetes系列(六):数据持久化实战
  8. 25.A Famous Music Composer
  9. 菜鸡的Java笔记 数据表与简单java类映射
  10. 基于Guava API实现异步通知和事件回调