zoukankan      html  css  js  c++  java
  • Spring整合Shiro

     

    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:用于操作安全数据(用户、权限、角色等)的,类似于DAOshiro框架提供,业可以自己编写

    • 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容器中配置一个beanid和上面的过滤器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" />

  • 相关阅读:
    php 函数汇总
    php 图片base64编码生成dataurl和保存为图片
    bootstrap
    PHPWord
    js json排序
    UE用法
    判断移动端是苹果还是安卓,以及安卓版本
    shell终极操作
    LINUX yum用法
    jquery对checkbox的操作汇总
  • 原文地址:https://www.cnblogs.com/sjzxs/p/9416312.html
Copyright © 2011-2022 走看看