shiro权限项目中的简单应用

SpringMVC+maven

项目需要使用shiro,所以自学了几天,仅提供给新手,请根据文档查看…该项目仅是测试项目,并不完善,只实现了需要使用的基本功能,并且只提供了使用shiro模块的代码。楼主新人第一次写,如有问题希望能提出来,由衷的感谢。




首先是pom.xml:


<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.2.0</version>
</dependency>


以下是web.xml配置:


<filter>
    <!-- filter-name需要和shiro的过滤器id一致 -->
    <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>


以下是shiro的配置:


<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="   
                http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
                http://www.springframework.org/schema/context 
                http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- shior配置 begin -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- <property name="cacheManager" ref="cacheManager" /> -->
        <!-- 自定义的Realm -->
        <property name="realm" ref="myRealm" />
    </bean>

    <!-- 缓存 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    </bean>

    <bean id="myRealm"
        class="com.renai.shop.service.admin.AuthenticationRealm">
        <!-- 加密 -->
        <!-- 
        <property name="credentialsMatcher"> 
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> 
                <property name="hashAlgorithmName" value="SHA-256"/> 
                <property name="storedCredentialsHexEncoded" value="false"/> 
            </bean> 
        </property> -->
    </bean>

    <!-- SecurityManager是shiro的核心,协调shiro的各个组件 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>

    <!-- shiro过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login/gotoLogin.html" />
        <property name="unauthorizedUrl" value="/unauthorized.jsp" />
        <property name="filterChainDefinitions">
            <value>
                /login/gotoLogin.html = anon
                /login/login.html = anon
                /login/** = authc
                /sys/** = authc                <!-- /sys/add/** = authc, roles[manager]
                /sys/update/** = authc, roles[admin]
                /sys/delete/** = authc, perms[delete] -->
            </value>
        </property>
    </bean>
</beans>


以下是自定义的Realm类:


package com.renai.shop.service.admin;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

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.UnknownAccountException;
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 com.renai.shop.dao.mapper.SysDictionaryMapper;
import com.renai.shop.filter.admin.AdmUserInfoFilter;
import com.renai.shop.model.admin.AdmPermission;
import com.renai.shop.model.admin.AdmRole;
import com.renai.shop.model.admin.AdmUserInfo;

/**
 * @作者 zjm
 * @类说明:
 * @创建日期 2015年03月19日
 * @版本 V 1.0
 */
public class AuthenticationRealm extends AuthorizingRealm {

    @Autowired
    private SysDictionaryMapper sysDictionaryMapper;

    /**
     * 给权限
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)  
        throws AuthenticationException{

        System.out.println("---------------doGetAuthorizationInfo---------------");
        
        //获取用户名
        String userName = (String) getAvailablePrincipal(principals);
        SimpleAuthorizationInfo info = null;
        
        if (userName != null) {
            //自定义实体类查询时的过滤器
            AdmUserInfoFilter userInfoFilter = new AdmUserInfoFilter();
            userInfoFilter.setUserName(userName);
            //按照yonghumi
            List<AdmUserInfo> userInfos = sysDictionaryMapper
                .selectUserInfoByFilter(userInfoFilter);
            
            if (userInfos.size() > 0) {
                List<AdmRole> roles = userInfos.get(0).getRoles();
                Set<String> roleNames = new HashSet<String>(); 
                Set<String> permissions = new HashSet<String>(); 
                for (AdmRole role : roles) {
                    roleNames.add(role.getName());
                    for (AdmPermission permission : role.getPermissions()) {
                        permissions.add(permission.getOperation());
                    }
                }
                info = new SimpleAuthorizationInfo(roleNames);
                info.setStringPermissions(permissions);
            }
            
        } else {
            System.out.println("---------------用户名不能为空!---------------");
        }
        
        return info;
    }

    /**
     * 登陆验证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {

        System.out.println("---------------doGetAuthenticationInfo---------------");
        
        UsernamePasswordToken upToken = (UsernamePasswordToken)token;
        SimpleAuthenticationInfo info = null;
        String userName = upToken.getUsername();
        String passWord = String.valueOf(upToken.getPassword());
        
        AdmUserInfo userInfo = sysDictionaryMapper.login(userName, passWord);
        if (userInfo == null) {
            //抛出的异常在LoginController中处理
            throw new UnknownAccountException("用户名或密码错误");
        }

        try {
            info = new SimpleAuthenticationInfo(userName, passWord, getName());
        } catch (Exception e) {
            throw new AuthenticationException("验证失败", e);
        }
        return info;
    }

}


登录Controller:


package com.renai.shop.admin.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.renai.shop.filter.admin.AdmMenuFilter;
import com.renai.shop.filter.admin.AdmUserInfoFilter;
import com.renai.shop.model.admin.AdmMenu;
import com.renai.shop.model.admin.AdmUserInfo;
import com.renai.shop.service.admin.api.ISysDictionaryService;

/**
 * @作者 张建明
 * @类说明:
 * @创建日期 2015年03月19日
 * @版本 V 1.0
 */
@RequestMapping(value = "/login")
@Controller
public class LoginController {

    @Autowired
    private ISysDictionaryService sysDictionaryService;

    @RequestMapping(value = "/gotoLogin.html")
    public String goToLogin(HttpServletRequest request,
            HttpServletResponse response, ModelMap modelMap) {

        return "login";
    }

    @RequestMapping(value = "/login.html")
    @ResponseBody
    public String login(HttpServletRequest request,
            HttpServletResponse response, ModelMap modelMap,
            @Param(value = "username") String username,
            @Param(value = "password") String password) {

        UsernamePasswordToken token = new UsernamePasswordToken(username,
                password);
        // 记住令牌
        token.setRememberMe(true);

        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
        } catch (UnknownAccountException ex) {
            System.out.println("用户名没有找到" + ex.toString());
            return "error";
        } catch (IncorrectCredentialsException ex) {
            System.out.println("用户名密码不匹配" + ex.toString());
            return "error";
        } catch (AuthenticationException e) {
            System.out.println("其他的登录错误" + e.toString());
            return "error";
        } catch (Exception e) {
            System.out.println("登陆失败" + e.toString());
            return "error";
        }

        return "success";
    }

    @RequestMapping(value = "/goToIndex.html")
    public String goToIndex(HttpServletRequest request,
            HttpServletResponse response, ModelMap modelMap) {

        Subject subject = SecurityUtils.getSubject();

        String userName = subject.getPrincipal().toString();
        if (StringUtils.isNotBlank(userName)) {
            AdmUserInfoFilter userInfoFilter = new AdmUserInfoFilter();
            userInfoFilter.setUserName(userName);
            List<AdmUserInfo> userInfos = sysDictionaryService
                    .selectUserInfoByFilter(userInfoFilter);

            if (userInfos.size() > 0) {

                AdmUserInfo userInfo = userInfos.get(0);
                AdmMenuFilter filter = new AdmMenuFilter();
                filter.setMenuType(1);

                // 查询权限
                if (userInfo.getRoles().size() > 0) {
                    List<AdmMenu> menuList = sysDictionaryService
                            .selectMenuByRolesId(
                                    userInfo.getAdmUserRoleInfos(), filter);
                    request.getSession().setAttribute("menuList", menuList);
                }
            }
        }

        return "index";
    }

}


系统Controller:


package com.renai.shop.admin.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.renai.shop.admin.service.AdmRoleVO;
import com.renai.shop.admin.service.AdmUserInfoVO;
import com.renai.shop.filter.admin.AdmMenuFilter;
import com.renai.shop.filter.admin.AdmPermissionFilter;
import com.renai.shop.filter.admin.AdmRoleFilter;
import com.renai.shop.filter.admin.AdmUserInfoFilter;
import com.renai.shop.model.admin.AdmMenu;
import com.renai.shop.model.admin.AdmPermission;
import com.renai.shop.model.admin.AdmRole;
import com.renai.shop.model.admin.AdmUserInfo;
import com.renai.shop.service.admin.api.ISysDictionaryService;

/**
 * @作者 张建明
 * @类说明:
 * @创建日期 2015年03月19日
 * @版本 V 1.0
 */
@RequestMapping(value = "/sys")
@Controller
public class SysController {

    @Autowired
    private ISysDictionaryService sysDictionaryService;

    @RequestMapping(value = "/getMenuByParent.html")
    public String getMenuByParent(HttpServletRequest request,
            HttpServletResponse response, ModelMap modelMap,
            @Param(value = "parentId") int parentId) {
        
        Subject subject = SecurityUtils.getSubject();
        
        String userName = subject.getPrincipal().toString();
        if (StringUtils.isNotBlank(userName)) {
            AdmUserInfoFilter userInfoFilter = new AdmUserInfoFilter();
            userInfoFilter.setUserName(userName);
            List<AdmUserInfo> userInfos = sysDictionaryService
                .selectUserInfoByFilter(userInfoFilter);
        
            if(userInfos.size() > 0){
                
                AdmUserInfo userInfo = userInfos.get(0);
                AdmMenuFilter filter = new AdmMenuFilter();
                filter.setMenuType(2);
                filter.setParentId(parentId);
                
                // 查询权限
                if (userInfo.getRoles().size() > 0) {
                    List<AdmMenu> thirdMenuList = sysDictionaryService
                            .selectMenuByRolesId(userInfo.getAdmUserRoleInfos(), filter);
                    request.getSession().setAttribute("thirdMenuList", thirdMenuList);
                }
            }
        }
        return "ajax/ajaxGetMenu";
    }
    
}


以下是页面:

使用shiro的标签需要引用:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>1

以下是按照登录时保存的权限显示按钮

<div class="tools">
    <ul class="toolbar">
        <shiro:hasPermission name="add">
            <li class="click" onclick="add()">
                <span><img src="${ctx}/skin/images/t01.png"></span>添加
            </li>
        </shiro:hasPermission>
        <shiro:hasPermission name="update">
            <li class="click" onclick="update()">
                <span><img src="${ctx}/skin/images/t02.png"></span>修改
            </li>
        </shiro:hasPermission>
        <shiro:hasPermission name="delete">
            <li onclick="deletes()">
                <span><img src="${ctx}/skin/images/t03.png"></span>删除
            </li>
        </shiro:hasPermission>
    </ul>
</div>


以下是项目数据


菜单表

角色表

权限表

以下是项目页面部分截图

第一个是“boos”角色登陆

第二个是“manager”角色登陆

第三个是“admin”角色登陆

时间: 2024-11-07 02:46:09

shiro权限项目中的简单应用的相关文章

Jwt在Java项目中的简单实际应用

1.什么是jwt 双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息.简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库. 2.Jwt在javaweb项目中的简单使用 第一步:引入maven依赖 <!--

Web项目中创建简单的错误处理页面

当应用程序出现错误的时候,如果没有做错误页面处理的话,会直接输出一些敏感的信息出来,有时候甚至会直接将项目所在的物理路径给显示出来,严重缺乏安全性,并且错误种类繁多,页面风格不一,导致用户体验不好,本文介绍如何在web项目中创建错误页面,从而友好的提示错误信息. 一,创建错误页面error.aspx,前台代码如下(可根据实际需要增加元素): <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&qu

ActiveMQ的在实际项目中的简单使用

简介 本文达到的目的是会用. 安装服务器: 官网下载win版的,也可是linux版的: 启动服务器:win版的执行activemq.bat 看看是否安装成功:http://localhost:8161/ activeMQ是一个消息服务器, 2中模式:点对点.广播 点对点:消息进入队列后,只会被接收一次,接收完了就在消息队列里消失了. 广播:采用的是广播订阅的方式,所有的订阅了此主题的,当此主题有消息时,都会接收到 可靠性: mq会将信息存储 /* * 消息的类型(消息体): * TextMess

shiro真正项目中的实战应用核心代码!!!

欢迎转载!!!请注明出处!!! 说道shiro的学习之路真是相当坎坷,网上好多人发的帖子全是简单的demo样例,核心代码根本没有,在学习过程中遇到过N多坑. 经过自己的努力,终于整出来了,等你整明白之后发现,确实没那么难,只是没人告诉你,自己去想向确实不好办,只能通过看源码加上自己猜想,不断尝试. 直接看主题.我就直接说受权这了,不说认证登录了,这种帖子n多个,我要说的是真正的核心代码!!!含金量超高!!!欢迎转载!请注明出处!!! 首先看先自定义的Realm: /** * 授权查询回调函数,

Android图片缓存技术!直接用在你的项目中,简单方便高效

好久没有写博客了,最近比较繁琐,什么面试呀,找工作呀,大三的生活就快完了,准确的是大学的生活就快完了!三年了,一直在搞移动开发,感觉好快呀,不想就这样的离开学校了!咳咳咳,扯远了... 前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imageview无法加载,可能是存在以下问题吧,况且导入框架导致开发的项目包越来越大,基于上面的这几种情况,于是我就想自

Redis在SSM项目中的简单使用

一.基于SSM的Redis环境配置 前提是你的开发电脑安装和配置好了redis,如果没安装请看Window配置Redis环境和简单使用 1.1.pom文件中引入redis客户端jar包(pom.xml) <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>j

Linux中ifreq 结构体分析和使用 及其在项目中的简单应用

[基础知识说明] 结构原型: /* * Interface request structure used for socket * ioctl's.  All interface ioctl's must have parameter * definitions which begin with ifr_name.  The * remainder may be interface specific. */ struct ifreq {#define IFHWADDRLEN 6 union { 

c#设计模式(1)—— 策略模式在实际项目中的简单应用

1.策略模式应用的核心概念 策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,使他们可以相互替换,策略模式使算法在不影响客户端情况下发生变化. 一个系统需要动态地在几种算法中选择一种的情况下.那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口. 2.场景描述 不同的数据库会有不同的数据访问方式及数据库脚本,采用策略模式可以很好的将数据访问类进行分离,不同的数据访问类只需实现统一的接口,具体的实现方法(不同的数据库执行脚本)在各自的数据访问类中进行

在Spring项目中使用@Scheduled注解定义简单定时任务

如题所示,有时候我们需要在Web项目中配置简单的定时任务,而且因为任务并不复杂不想使用定时调度框架(PS:Quartz.ActiveMQ .Kafka等),这时就可以考虑使用@Scheduled注解来定义简单的定时任务.其全部配置如下: (1)在Spring的配置文件中添加定时任务相关配置: xml配置的头文件中添加: xmlns:task="http://www.springframework.org/schema/task" 以及在xsi:schemaLocation中添加: ht