一.在web项目中实现认证
第一步,在web项目中导入shiro依赖的包
第二步,在web.xml中声明shiro拦截权限的过滤器
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!--保证该过滤器的生命周期和spring 工厂中shiro过滤器对象的生命周期一致-->
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
<!--声明该过滤器代理工厂类中的id为什么的shiro过滤器对象-->
<init-param>
<param-name>targetBeanName</param-name>
<param-value>shiroFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第三步,在spring的主配置文件中声明shiro的配置信息
shiro的配置信息比较多,一般不和spring的主配置文件放到一起。一般都会单独建立一个shiro和spring集成的配置文件。 

创建好该文件后,要在spring.xml中引入该文件:

在spring中自定义域对象: 
/**
* 实现自定义域
* Authorization 授权(权限校验)
*
* Authentication 认证(登录校验)
*
*/
public class AuthRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
//获取授权信息
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
//获取认证信息
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws
AuthenticationException {
//获取用户名 不过一般往shiro中放置用户身份信息的时候,不直接放用户名字符串,放用户对象
String username = token.getPrincipal().toString();
//有了用户名,要根据用户名在数据库中查询用户对象
Users user = userService.findByUsername(username);
//判断如果用户对象不存在,抛出UnknownAccountException
if(user==null){
throw new UnknownAccountException("用户名不存在");
}
//封装用户的身份对象 返回这个身份对象
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),"authRealm");
return info;
}
}
在shiro的主配置文件spring-shiro.xml中做配置: 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建自定义域对象-->
<bean id="authRealm" class="com.aaa.ssm.realm.AuthRealm"></bean>
<!--创建shiro的安全管理器对象-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--要声明域,在域中读取认证和授权的数据-->
<property name="realm" ref="authRealm"></property>
</bean>
<!--创建shiro的过滤器对象-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--要注入安全管理器对象-->
<property name="securityManager" ref="securityManager"></property>
<!--配置登录请求的路径-->
<property name="loginUrl" value="/user/login.do"></property>
<!--配置shiro认证和授权的过滤器-->
<property name="filterChainDefinitions">
<value>
<!--对静态资源不拦截-->
<!--anon指匿名访问的过滤器,所有匿名用户都可以访问static下面的资源-->
/static/*=anon
/user/login.do=anon
/login.jsp=anon
<!--authc指必须经过认证(登录过之后)才能访问的请求 /*代表所有有一个斜杠的请求都要经过认证 -->
/*=authc
/*/*=authc
</value>
</property>
</bean>
</beans>
第四步,在控制器中使用shiro去做登录认证
/**
* 用户登录的请求
* @param user
* @return
*/
@RequestMapping("/login")
public String login(Users user, Model model, HttpSession session){
//获取用户的主体对象
Subject subject = SecurityUtils.getSubject();
//封装用户名和密码的认证信息对象
UsernamePasswordToken upt = new UsernamePasswordToken(user.getUsername(),user.getPassword());
//进行登录认证
try {
subject.login(upt);
}catch (Exception e){
e.printStackTrace();
System.out.println("用户名或者密码错误");
return "redirect:/login.jsp";
}
return "index";
}
二.在web项目中实现授权
当前我们还没有配置授权的信息,所以用户登录成功之后能访问所有的请求。 
配置文件的方式 
xml的方式 
第一步,在shiro的主配置文件中配置授权信息
第二步,当前登录用户有哪些授权信息从自定义的realm中读取 
注解的方式
第一步,开始spring的shiro的注解的支持 
注意,开启注解的支持之前,应该保证项目中有spring 的aop的jar包的,aspectj等的jar包。 
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- aspectj相关jar包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
要在spring mvc的主配置文件中声明shiro的注解的支持: 
第二步,在控制器的代码中增加需要授权的注解 

第三步,同xml的方式的第二步
第四步,声明spring mvc的统一异常处理 
因为如果用户没有权限,会跳转到500界面,不友好,我们可以使用spring mvc统一异常处理机制,让用户跳转到一个统一的界面。 
 

在web项目中使用shiro(认证、授权)的更多相关文章

  1. SpringBoot系列: SpringBoot Web项目中使用Shiro 之二

    ==================================Shiro 的加深理解:==================================1. Shiro 和 Spring 系组 ...

  2. SpringBoot系列: SpringBoot Web项目中使用Shiro

    注意点有:1. 不要启用 spring-boot-devtools, 如果启用 devtools 后, 不管是热启动还是手工重启, devtools总是试图重新恢复之前的session数据, 很有可能 ...

  3. 在web项目中使用shiro(记住我功能)

    第一步,添加“记住我”复选框,rememberMe要设置参数 第二步,配置shiro的主配置文件 注意 rememberMeCookie对应的bean中要声明 <constructor-arg ...

  4. 细说shiro之四:在web应用中使用shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

  5. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  6. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

  7. 前后端分离Web项目中,RBAC实现的研究

    在前后端分离Web项目中,RBAC实现的研究   最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...

  8. AngularJS进阶(十七)在AngularJS应用中实现微信认证授权遇到的坑

    在AngularJS应用中集成微信认证授权遇到的坑 注:请点击此处进行充电! 前言 项目开发过程中,移动端新近增加了一个功能"微信授权登录",由于自己不是负责移动端开发的,但最后他 ...

  9. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

随机推荐

  1. mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的

    mysql命令行参数  --- 这些参数不同于  mysqldump  后的 那些参数   :2种类型的参数 含义是不一样的 一,mysql命令行参数 Usage: mysql [OPTIONS] [ ...

  2. 跨域cookies 共享

    这是由于,本地调试.涉及到cookies的问题 想要跨域使用的问题 vue 中的mian.js中放入下面代码 import axios from 'axios' axios.defaults.with ...

  3. AJ学IOS(45)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。

    AJ分享,必须精品 简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信.打开其他应用等. 打电话 方法1 最简单最直接的方式:直接跳到拨号界面 NSURL ...

  4. 路径跟踪 PathMeasure的简单使用

    平时用path画一些简单的几何图形,呈现的时候也是已经绘制好的图形,想想,如果像动画一样看到它的绘制轨迹,是不是更酷?今天介绍的这个类PathMeasure就是干这个的,知道它的存在还是由于看了启舰写 ...

  5. elasticsearch7.6.2实战(2)-es可视化及分析平台-kibana

    1. 场景描述 elasticsearch部署完成后,es官方提供了可视化.分析及管理平台-kibana,部署下,有需要朋友参考下,不谢! 2. 解决方案 2.1 下载 (1)地址:https://w ...

  6. Python之疑难杂症包安装

    ansible 直接用pip install 安装一直失败 1.下载ansible压缩包 https://files.pythonhosted.org/packages/ec/ee/1494474b5 ...

  7. jdbctemplate打印sql

    在logback.xml里加入如下配置即可: <include resource="org/springframework/boot/logging/logback/base.xml& ...

  8. overload 与override的区别

    Override  是重写: 方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload 是重载:  方法名称不变,其余的都是可以变更的.它的关系是同一个类 ...

  9. 机器学习5- 对数几率回归+Python实现

    目录 1. 对数几率回归 1.1 求解 ω 和 b 2. 对数几率回归进行垃圾邮件分类 2.1 垃圾邮件分类 2.2 模型评估 混淆举证 精度 交叉验证精度 准确率召回率 F1 度量 ROC AUC ...

  10. Redis学习与应用-位图

    什么是位图 位图bitmap是通过一个bit来表示某个元素对应的值或者状态,是由一组bit位组成,每个bit位对应0和1两个状态,虽然内部还是采用string类型进行存储,但是redis提供了直接操作 ...