shrio QuickStart
Shrio三大对象:


springboot整合shrio
登录拦截认证
创建项目时勾选web,导入依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
自定义一个登录页面,shrio不同于spring-secruity给我做好了登录页面,我们需要自定义
login.html代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<p th:text="${msg}" style="color:red;"></p>
<form th:action="@{/Login}" >
<div>用户名:<input type="text" name="username" placeholder="username"></div>
<div>密码:<input type="password" name="password" placeholder="password"></div>
<button>登录</button>
</form>
</body>
</html>
controller代码 测试是否成功拦截并跳转到登录页面

package com.lian.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MycController {
@RequestMapping("/user/add")
public String add(){
return "add";
}
@RequestMapping("/user/update")
public String UPDATE(){
return "update";
} @RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
@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);
return "index"; }
catch (UnknownAccountException e){
model.addAttribute("msg","用户名错误");
return "login";
}
catch (IncorrectCredentialsException e){
model.addAttribute("msg","密码错误");
return "login";
}
}
}
登录拦截并认证配置代码
注意shrio自己帮我们进行了密码的认证,只需要传入password到类SimpleAuthenticationInfo的构造方法中即可

package com.lian.config; import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; public class UserRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
return null;
}
@Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行力=>认证doGetAuthenticationInfo");
String username="lian";
String password="123";
UsernamePasswordToken userToken=(UsernamePasswordToken)token;
if(!userToken.getUsername().equals(username)){//前端传入的用户名和这里设置的不同
//不同,抛出异常
return null;//
}
return new SimpleAuthenticationInfo("",password,"");
}
}
启动主启动类同时在网页进行测试
授权
用户在提交登录表单瞬间后台要判断用户拥有哪些权限,我们在数据库中新增 个字段perms代表用户权限,同时注意如果用户没有某个子页面的权限,那么在用户登录成功后就不用展示那个页面对应的超链接了,因此我们也需要整合thymeleaf和shrio
检查一下环境

public class UserRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
return null;
}
@Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下代码有没有其他问题
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行力=>认证doGetAuthenticationInfo");
String username="lian";
String password="123";
UsernamePasswordToken userToken=(UsernamePasswordToken)token;
if(!userToken.getUsername().equals(username)){//前端传入的用户名和这里设置的不同
//不同,抛出异常
return null;//
}
return new SimpleAuthenticationInfo("",password,"");
}
}
思路:shiro登录认证的根本是先根据用户名查询出用户的账号密码等信息保存到
SimpleAuthenticationInfo中,试图登录的用户信息保存到UsernamePasswordToken中,
最后通过subject调用login方法实现登录信息的匹配对比。
1.创建项目时勾选web,导入thymeleaf依赖:
2.查看源码查看shrio中要授权用户的方法应该如何写

测试代码:
UserRealm.java

package com.lian.config; import com.lian.pojo.User;
import com.lian.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired; public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了=>授权doGetAuthorizationInfo");
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
info.addStringPermission("user:add");
//拿到当前登录的用户的对象
Subject subject= SecurityUtils.getSubject();
User currrentUser= (User) subject.getPrincipal();//拿到user对象
//设置当前用户的权限
info.addStringPermission(currrentUser.getPerms());
return info;
}
@Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行力=>认证doGetAuthenticationInfo");
//token令牌
UsernamePasswordToken userToken=(UsernamePasswordToken)token;
//连接真实数据库,比较数据库的用户名和前端用户名是否一致
User user= userService.queryUserByName(userToken.getUsername());
// ,而shiro登录认证的根本是先根据用户名查询出用户的账号密码等信息保存到
// SimpleAuthenticationInfo中,试图登录的用户信息保存到UsernamePasswordToken中,
// 最后通过subject调用login方法实现登录信息的匹配对比,
if(user==null){//前端传入的用户名和这里设置的不同
System.out.println("用户不存在!");
return null;//报错
}
Subject currentSubject=SecurityUtils.getSubject();
Session session=currentSubject.getSession();
session.setAttribute("loginUser",user);
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}
ShrioConfig

package com.lian.config; import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
import java.util.Map; @Configuration
public class ShrioConfig {
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
/*
* 添加shrio的内置过滤器
* anon:无需认证可以访问
* anthc:必须认证才能访问
* user:必须拥有记住我功能才能用
* perms:拥有对某某个资源的权限才能访问
* role:拥有某个角色权限才能访问*/
//拦截
Map<String,String> filterMap=new LinkedHashMap<>();
//授权,正常情况下,没有授权会跳转到未授权的页面
filterMap.put("/user/add","perms[user:add");
filterMap.put("/user/add","perms[user:update");
filterMap.put("/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap); //设置登录的请求
bean.setLoginUrl("/toLogin");
//未授权的页面,表明在用户点击某个a连接时发现未经认证,要走下面这个controller方法走
bean.setUnauthorizedUrl("/noauth");
return bean;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
//关联userRealm
securityManager.setRealm(userRealm);
return securityManager;
} @Bean(name = "userRealm")
//创建realm对象,需要自定义类
public UserRealm realm(){
return new UserRealm();
}
}
前端thymeleaf和shiro整合

shrio QuickStart的更多相关文章
- Shrio Demo
package com.atguigu.shiro.helloworld; import org.apache.shiro.SecurityUtils; import org.apache.shiro ...
- SpringMVC + Spring + MyBatis 整合 + Spring shrio + easyUI + 权限管理框架,带shrio session和shrio cache集群实现方案
工作之余先来写了一个不算规范的简单架子 基于spring mvc + spring + mybatis + Spring shrio 基于redis的集群方案 系统权限部分,分成多个机构,其中每个机构 ...
- [译]App Framework 2.1 (1)之 Quickstart
最近有移动App项目,选择了 Hybrid 的框架Cordova 和 App Framework 框架开发. 本来应该从配置循序渐进开始写的,但由于上班时间太忙,这段时间抽不出空来,只能根据心情和 ...
- 免安裝、免設定的 Hadoop 開發環境 - cloudera 的 QuickStart VM
cloudera 的 QuickStart VM,為一種免安裝.免設定 Linux 及 Hadoop,已幫你建好 CDH 5.x.Hadoop.Eclipse 的一個虛擬機環境.下載後解壓縮,可直接以 ...
- JBoss QuickStart之Helloworld
下载Jboss, quickstart, 按照quickstart说明, mvn clean install. 由于ssl handshake问题(应该是网络连接不稳定), 写了一个脚本不停地尝试bu ...
- [翻译]lithium 快速上手(QuickStart)
快速入门 经典博客教程 很感谢你尝试Li3!这一部分栏目为那些想了解这个框架可以做什么的php用户所设计.像这样深入代码是一种很好的方式去体会快速应用开发(Rapid Application ...
- Deep learning:四十四(Pylearn2中的Quick-start例子)
前言: 听说Pylearn2是个蛮适合搞深度学习的库,它建立在Theano之上,支持GPU(估计得以后工作才玩这个,现在木有这个硬件条件)运算,由DL大牛Bengio小组弄出来的,再加上Pylearn ...
- quickstart.sh
#!/bin/bashjava_pid=`ps -ef | grep java | grep 'com.kzhong.huamu.sisyphus.QuickStartServer' | awk '{ ...
- Confluent介绍(二)--confluent platform quickstart
下载 http://www.confluent.io/download,打开后,显示最新版本3.0.0,然后在右边填写信息后,点击Download下载. 之后跳转到下载页面,选择zip 或者 tar都 ...
- WPF QuickStart系列
接触WPF有一段时间了,现在做的项目也是WPF相关的.所以决定写一个WPF QuickStart系列的文章.也是自己对WPF学习的总结,如果对你有帮助,就非常棒了.因为不善言辞,所以尽量以WPF示例和 ...
随机推荐
- 使用 Agora SDK 开发 React Native 视频通话App
在 React Native 的应用中,从头开始添加视频通话功能是很复杂的.要保证低延迟.负载平衡,还要注意管理用户事件状态,非常繁琐.除此之外,还必须保证跨平台的兼容性. 当然有个简单的方法可以做到 ...
- 【读书笔记】组合计数中的行列式方法 专题3 完美匹配: the Pfaffian method
目录 专题3-Perfect matchings: the Pfaffian method 一些定义 用2×1的砖密铺a×b的大矩形的方法数 专题3-Perfect matchings: the Pfa ...
- Java程序死锁问题定位与解决
更多内容,前往 IT-BLOG 一.概述 死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁 ...
- uniApp安卓离线SDK运行
一.下载uniapp提供的离线SDK包 下载地址:https://nativesupport.dcloud.net.cn/AppDocs/download/android 版本:2022年09月26日 ...
- 在线编写Markdown
部署 editor.md 实现在线编写MD 安装Nginx服务 apt install nginx yum install nginx 修改Nginx配置 root@cby:~# vim /etc/n ...
- windows通过修改注册表来修改暂停更新时间
但通过修改注册表,我们可以将这个天数修改成自己期望的,比如10年. 在小娜或者运行中输入 regedit 打开注册表编辑器,展开至 HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...
- Anaconda 安装 PyTorch 和 DGL
安装 PyTorch Anaconda 是 PyTorch 官方推荐的包管理工具,它会帮助安装所有的依赖项.当使用 conda 安装的时候,可能会出现下载过慢的问题,需要更换清华源来代替默认的cond ...
- VMware另一个程序锁定文件的一部分,进程无法访问
问题描述:搭建RAC11g,在做共享磁盘的时候,节点2要共享节点1的磁盘,但是有一个问题,节点2关机之后,再打开,是有一个访问节点1的磁盘的过程,如果访问失败,就会开不了机器 rac1加的三个磁盘: ...
- MySQL(六)存储引擎
存储引擎 连接管理.查询缓存.解析器和执行器被归为MySQL service,而把真实存储数据的功能划分为存储引擎的功能.所以MySQL service经过查询优化后,只需按照生成的执行计划调用存 ...
- 探究公众号接口漏洞:从后台登录口到旁站getshell
探究公众号接口漏洞:从后台登录口到旁站getshell 1.入口 发现与利用公众号接口安全漏洞 某120公众号提供了一处考核平台,通过浏览器处打开该网站. 打开可以看到一处密码登录口,试了一下常用的手 ...