引入shiro依赖

        <!-- shiro -->
<dependency> <!-- shiro-core Required in all environments. -->
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency> <!-- Enables support for web-based applications. -->
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency> <!-- Enables AspectJ support for Shiro AOP and Annotations. -->
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-aspectj</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency> <!-- Enables Spring Framework integration. -->
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- -->

web.xml中添加ShiroFilter

  • Shiro 提供了与 Web 集成的支持,其通过一个ShiroFilter 入口来拦截需要安全控制的URL,然后进行相应的控制
  • ShiroFilter 类似于如 Strut2/SpringMVC 这种web 框架的前端控制器,是安全控制的入口点,其负责读取配置(如ini 配置文件),然后判断URL是否需要登录/权限等工作。、
  • DelegatingFilterProxy 作用是自动到 Spring 容器查找名字为 shiroFilter(filter-name)的 bean 并把所有 Filter的操作委托给它。
 <!-- Shiro Filter is defined in the spring application context: -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

spring核心配置文件中配置shiro

   <!-- 自定义Realm -->
<bean id="JdbcRealm" class="com.nchu.shiro.JdbcRealm" ></bean> <!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="JdbcRealm"/>
</bean> <!-- shiroFilter /pub/** = anon -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="loginUrl" value="/shiro/login.jsp" />
<property name="successUrl" value="/shiro/list.jsp"/>
<property name="unauthorizedUrl" value="/shiro/unauthorized.jsp"/>
<property name="securityManager" ref="securityManager"/>
<!--1).anon可以被匿名访问
2).authc被认证后可被访问,没有认证会被重定向到loginUrl指定的页面
3).logout登出-->
<property name="filterChainDefinitions">
<value>
/login = anon
/shiro/login = anon
/shiro/logout=logout
/** = authc
</value>
</property>
</bean> <!-- Shiro生命周期处理器-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

身份验证

  • 身份验证:一般需要提供如身份 ID 等一些标识信息来表明登录者的身份,如提供 email,用户名/密码来证明。
  • 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份:
  • principals:身份,即主体的标识属性,可以是任何属性,如用户名、邮箱等,唯一即可。一个主体可以有多个 principals,但只有一个Primary principals,一般是用户名/邮箱/手机号。
  • credentials证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
  • 最常见的 principals 和 credentials 组合就是用户名/密码

Shiro 认证流程

1、前端请求

  1). 创建一个表单页面:login.jsp

<%--
Created by IntelliJ IDEA.
User: root
Date: 2018/1/16 0016
Time: 19:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Login Page</h2> <form action="${pageContext.request.contextPath}/shiro/login" method="post">
UserName : <input type="text" name="username">
<br><br>
PassWord : <input type="password" name="password">
<br><br>
<input type="submit" value="登录">
</form>
</body>
</html>

  2). 把请求提交到 SpringMVC 的 Handler
  3). Handler获取用户名和密码.

2、获取当前的 Subject. 调用 SecurityUtils.getSubject();

3、测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated()

4、若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象

5、执行登录: 调用 Subject 的 login(AuthenticationToken) 方法.

package com.nchu.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* Created by yangshijing on 2018/1/16 0016.
*/
@Component
@RequestMapping("/shiro")
public class ShiroController {
public static final String SUCCESS = "success";
@RequestMapping("/login")
public String login(@RequestParam("username") String username,@RequestParam("password") String password){
//获取当前的 Subject
Subject currentUser = SecurityUtils.getSubject();
//判断当前的用户是否已经被认证
if (!currentUser.isAuthenticated()) {
//若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
try {
//测试token是否和自定义中的Realm的入参token相同
System.out.println("++++++++>"+token.hashCode());
// 执行登录
currentUser.login(token); }
catch (AuthenticationException ae) {
System.out.print("登录失败");
return "error";
}
}
return "redirect:/shiro/list.jsp"; }
}

6、自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro.

1). 需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
2). 实现 doGetAuthenticationInfo(AuthenticationToken token) 方法.

7、由 shiro 完成对密码的比对.

package com.nchu.shiro;

import com.nchu.mvc.bean.PracticeUser;
import com.nchu.mvc.dao.ShiroRealmMapper;
import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.springframework.beans.factory.annotation.Autowired; /**
* Created by yangshijing on 2018/1/16 0016.
*/
public class JdbcRealm extends AuthenticatingRealm {
@Autowired
ShiroRealmMapper shiroRealmMapper;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("----->"+token.hashCode());
//1. 把 AuthenticationToken 转换为 UsernamePasswordToken
UsernamePasswordToken upToken = (UsernamePasswordToken) token; //2. 从 UsernamePasswordToken 中来获取 username
String username = upToken.getUsername(); //3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录 System.out.println("从数据库中获取 username: " + username + " 所对应的用户信息.");
String password = shiroRealmMapper.login(username);
//4. 若用户不存在, 则可以抛出 UnknownAccountException 异常
if(password==null){
throw new UnknownAccountException("用户不存在!");
} //5. 根据用户信息的情况, 决定是否需要抛出其他的 AuthenticationException 异常.
/* if("monster".equals(username)){
throw new LockedAccountException("用户被锁定");
}*/
//6. 根据用户的情况, 来构建 AuthenticationInfo 对象并返回.
//通常使用的实现类为: SimpleAuthenticationInfo
//以下信息是从数据库中获取的.
//1). principal: 认证的实体信息. 可以是 username, 也可以是数据表对应的用户的实体类对象.
Object principal = username;
//2). credentials: 密码.
Object credentials = password;
//3). realmName: 当前 realm 对象的 name. 调用父类的 getName() 方法即可
String realmName = getName();
SimpleAuthenticationInfo info =
new SimpleAuthenticationInfo(principal, credentials, realmName);
return info;
}
}

mybatis框架从数据库中查询

mapper接口

package com.nchu.mvc.dao;
import org.springframework.stereotype.Component;
/**
* Created by yangshijing on 2018/1/16 0016.
*/
@Component
public interface ShiroRealmMapper { String login(String username);
}
mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nchu.mvc.dao.ShiroRealmMapper">
<select id="login" resultType="java.lang.String">
SELECT password FROM practice_user
Where user_name=#{userName}
</select> </mapper>

Shiro——认证的更多相关文章

  1. Apache Shiro 使用手册(二)Shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的"实体/凭证"组合便是&quo ...

  2. Apache Shiro 认证过程

    3.1.1    示例 Shiro验证Subjects 的过程中,可以分解成三个不同的步骤: 1. 收集Subjects 提交的Principals(身份)和Credentials(凭证): 2. 提 ...

  3. shiro认证登录实现

    准备工作: 在web.xml中配置shiro核心过滤器 在spring配置文件中提供核心过滤器运行所需要的辅助bean对象,在对象内注入安全管理器 拦截认证 配置三个url 拦截除了登录页面以及认证a ...

  4. 【shiro】(4)---Shiro认证、授权案例讲解

    Shiro认证.授权案例讲解 一.认证  1. 认证流程     2.用户密码已经加密.加盐的用户认证 (1)测试类 // 用户登陆和退出,这里我自定了一个realm(开发肯定需要自定义realm获取 ...

  5. 无状态shiro认证组件(禁用默认session)

    准备内容 简单的shiro无状态认证 无状态认证拦截器 import com.hjzgg.stateless.shiroSimpleWeb.Constants; import com.hjzgg.st ...

  6. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  7. frame shiro 认证示例及原理简述

    shiro 认证流程 1.创建一个 javaSE 的maven项目(quickstart),并添加依赖 <dependency> <groupId>junit</grou ...

  8. Shiro认证的另一种方式

    今天在学习shiro的时候使用另一种shiro验证的方式. 总体的思路是: (1)先在自己的方法中进行身份的验证以及给出提示信息.(前提是将自己的验证方法设为匿名可访问) (2)当验证成功之后到Shi ...

  9. 将 Shiro 作为应用的权限基础 二:shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一. ...

  10. springmvc+shiro认证框架配置

    1,在web.xml中配置fiter,如下所示 <!-- shiro的filter --> <!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spr ...

随机推荐

  1. [樹莓派]用mkusb来制作U盘启动安装Ubuntu 15.04

    之前實踐過這文章的描述,還可以成功:http://www.linuxdiyf.com/linux/12719.html,轉記錄餘下: 官方英文文档,教你在Ubuntu 15.04下使用mkusb来制作 ...

  2. 10 结构体和类 - —— 《Swift3.0 从入门到出家》

    Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...

  3. LINUX 11G RAC ASM磁盘组在线增加磁盘扩容

    LINUX 11G RAC ASM磁盘组在线增加磁盘扩容 1.操作系统版本 OEL 6.1 [root@cqltjcpt1 ~]# more /etc/redhat-release Red Hat E ...

  4. flask之redis

    redis 连接需要host port passwod Hash:key-fields-value(做缓存)相当于一个key对于一个map,map中还有key-valueList:有顺序可重复(处理不 ...

  5. DELPHI中使用UNIDAC连接ORACLE数据库

    DELPHI中使用UNIDAC连接ORACLE数据库   最近在DELPHI中使用到UNIDAC连接到oracle数据库,这样可以不要安装oracle客户端,比较方便使用:所以简单学习了一下,主要是用 ...

  6. oracle查询题目2道

    1.列出与“SCOTT”从事相同工作的所有员工. ①先查询SCOTT从事的是什么工作 select job from emp where name like='SCOTT'; ②select enam ...

  7. 阿里Java开发规范记录(一)

      近日,从网上下载了阿里云栖社区发布的<阿里巴巴Java开发手册(正式版)>v1.1.0版.从编程以来,一直苦于没有相关的.全面的.靠谱的规范可以参考,有了这手册,日后编程也算是找到了依 ...

  8. PHP实现日志写入log.txt

    引言:有时候调试,看不到效果,需要通过写入文件来实现. 案例: <?php $myfile = fopen("log.txt", "a+") or die ...

  9. 记一次oralce 11g r2 rac安装问题

    环境:虚拟机[root@rac1 ~]# lsb_release -aLSB Version:        :base-4.0-amd64:base-4.0-noarch:core-4.0-amd6 ...

  10. JCE无限制权限策略文件

    JCE无限制权限策略文件,里面是对应jdk6和jdk7的文件 官网下载地址是 JDK6:http://www.oracle.com/technetwork/java/javase/downloads/ ...