apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式。其提供的 native-session(即把用户认证后的授权信息保存在其自身提供 Session 中)机制,这样就可以和 HttpSession、EJB Session Bean 的基于容器的 Session 脱耦,到和客户端应用、Flex 应用、远程方法调用等都可以使用它来配置权限认证。 在 exit-web-framework 里的 vcs-admin 例子用到该框架,具体使用说明可以参考官方帮助文档。 在这里主要讲解如何与 spring 结合、动态创建 filterchaindefinitions、以及认证、授权、和 缓存处理。

核心功能:认证、授权、加密、会话管理

执行流程:

Application Code:应用程序代码,程序员编写的代码

Subject:接口,代表当前用户,由shiro框架提供的

SecurityManager:安全管理器,由shiro框架提供

Realm:用于操作安全数据(用户、权限、角色等)的,类似于DAO,shiro框架提供,业可以自己编写

  • apache shiro 结合 spring(登录shiro应用)

第一步:在pom.xml中引入shiro的坐标:

      <!-- 权限控制 框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>${shiro.version}</version>
        </dependency>

  第二步:在web.xml中配置整合shiro的过滤器

  <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  第三步:在spring容器中配置一个bean,id和上面的过滤器name相同

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

<!-- 注入安全管理器对象 -->

<property name="securityManager" ref="securityManager"/>

<!--

private String loginUrl;

private String successUrl;

private String unauthorizedUrl;

-->

<property name="loginUrl" value="/login.html"/>

<property name="successUrl" value="/index.html"/>

<property name="unauthorizedUrl" value="/unauthorizedUrl.html"></property>

<!-- 第一种权限控制方式:url拦截实现权限控制 -->

<property name="filterChainDefinitions">

<!--

authc:代表shiro框架提供的一个过滤器,作用是用于检查当前用户是否已经完成登录(认证)

如果已经完成登录,就放行,如果没有完成登录,跳转到登录页面

anon:代表框架提供的一个过滤器,作用是可以匿名(未登录)访问

-->

<value>

/login.html = anon

/js/** = anon

/css/** = anon

/images/** = anon

/validatecode.jsp* = anon

/userAction_login.action = anon

/** = authc

</value>

</property>

</bean>

  第四步:配置安全管理器

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"></bean>

  第五步:提供UserAction,创建login方法

package cn.itcast.bos.web.action;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.mytest.bos.domain.User;
import cn.mytest.bos.service.IUserService;
import cn.mytest.bos.utils.MD5Utils;
@ParentPackage("struts-default")
@Namespace("/")
@Actions
@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User> {
    @Resource
    private IUserService userService;
    private String checkcode;
    public void setCheckcode(String checkcode) {
        this.checkcode = checkcode;
    }
    @Action(value = "userAction_login", results = {
            @Result(name = "success", location = "/index.jsp", type = "redirect"),
            @Result(name = "login", location = "/login.jsp", type = "redirect") })
    public String login() {
        String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
        if (StringUtils.isNotBlank(checkcode) && checkcode.equals(key)) {
            Subject subject = SecurityUtils.getSubject();
            AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),
                    MD5Utils.md5(model.getPassword()));
            try {
                subject.login(token);
                return "success";
            } catch (Exception e) {
                e.printStackTrace();
                return "login";
            }
        } else {
            return "login";
        }
    }
}

 第六步:自定义一个realm

    package cn.itcast.bos.myrealm;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import cn.mytest.bos.domain.User;
import cn.mytest.bos.service.IUserService;

public class MyRealm extends AuthorizingRealm {

@Autowired
    private IUserService userservice;

@Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection paramPrincipalCollection) {
        // TODO Auto-generated method stub
        SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
        sai.addStringPermission("courier");
        return sai;
    }

/*
     * 认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken paramAuthenticationToken)
            throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) paramAuthenticationToken;
        String username = token.getUsername();
        User us = userservice.findByUsername(username);
        if (null != us) {
            return new SimpleAuthenticationInfo(us, us.getPassword(), this.getName());
        }
        return null;
    }

}

提供UserDao接口:

package cn.itcast.bos.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import cn.mytest.bos.domain.User;
public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>{

User findByUsername(String username);

}

    第七步配置spring 配置文件

    <!-- 注册安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosLoginRealm" />
    </bean>
    <!-- 配置自定义realm -->
    <bean id="bosLoginRealm" class="cn.itcast.bos.myrealm.MyRealm" />

Spring整合Shiro的更多相关文章

  1. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

  2. Spring整合Shiro并扩展使用EL表达式

    Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...

  3. Spring 整合 Shiro

    一.引入依赖 <!-- spring start --> <dependency> <groupId>org.springframework</groupId ...

  4. Spring整合Shiro 权限 角色 用户关系分析

    Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...

  5. spring整合shiro框架

    上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制 1.搭建环境 这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架, ...

  6. 【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面

    这几天粗浅的把shiro整合到spring中,并且注解控制shiro用户/角色/权限And/OR 步骤: 1.首先maven搭建web项目 2.创建数据库 user/role/authority 其中 ...

  7. 【原】Spring整合Shiro基础搭建[3]

    1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Sprin ...

  8. spring整合shiro配置BUG,Tomcat启动不了:Error during artifact deployment. See server log for details

    现象 spring配置shiro权限控制之后,项目无法启动 [2019-08-09 09:00:35,800] Artifact export_web_manager:war exploded: Er ...

  9. spring 整合 shiro框架

    shiro是用来干嘛的?从它的官网上(http://shiro.apache.org/)基本可以了解到,她主要提供以下功能: (1)Authentication(认证) (2)Authorizatio ...

随机推荐

  1. 谈谈javascript数组排序方法sort()的使用,重点介绍参数使用及内部机制?

    语法:arrayObject.sort(sortby) 参数sortby可选,规定排序顺序,必须是函数: 注:如果调用该方法时没有使用参数,将按字符编码的顺序进行排序,要实现这一点,首先应把数组的元素 ...

  2. Ubuntu上Xilinx ARM交叉编译器安装

    1,Windows中下载交叉编译器 2,在ubuntu中创建zedboard目录,并将交叉编译器复制进来 3,将该交叉编译器设置成可执行程序 chmod  a+x  xilinx-2011.09-50 ...

  3. React Native入坑记录

    1.render中如果使用props,直接用this.props.xxx,如果是在JSX中,用{this.props.xxx} 2.警告each child in an array or iterat ...

  4. 怎样打开U盘最安全

    为了避免电脑使用U盘时,通过双击,或者右击盘符时,导致把病毒感染至整个电脑,因此使用下面的方法,可使U盘病毒不被激活传播. 在取消了U盘自动运行的情况下(在组策略中一定要关闭自动运行功能,否则只要一插 ...

  5. 前端框架之Vue(3)-计算属性

    计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...

  6. PageHelper分页插件

    在mybatis配置文件(SqlMapConfig.xml)中配置 <?xml version="1.0" encoding="UTF-8" ?> ...

  7. js图的数据结构处理---迪杰斯特拉算法

    /*//1.确定数据结构, mapf[i][j] 为点i到点j的距离 [ Infinity 2 5 Infinity Infinity Infinity Infinity 2 6 Infinity I ...

  8. [文摘]那些一心想要离开 BAT 的人,后来怎么样了?

    人心是个无底洞,填不满也掏不空 <Working at Google seemed like a dream job. The reality has been a tedious, point ...

  9. C# 抽象类、抽象属性、抽象方法

    抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象. 下面我们以水果为例,首先定义抽象类Fruit,抽象类中有公共属性vendor,抽象属 ...

  10. jmeter4.0 执行jmeter_server.bat报错

    Jmeter分布式执行1.-------------------------------Jmeter4.0  执行jmeter_server.bat   报错,是由于4.0要手工生成密钥 bin目录下 ...