SSM中shiro的基本使用

shiro

  用以网站的授权和认证

配置:

一、shiro基本配置文件

  所用的entity user和role 实体类

 1 @Entity
 2 @Table(name="USER_P")
 3 @DynamicInsert(value=true)
 4 @DynamicUpdate(value=true)
 5 public class User extends BaseEntity {
 6     @Id
 7     @Column(name="USER_ID")
 8     @GeneratedValue(generator="system-assigned")
 9     @GenericGenerator(name="system-assigned",strategy="assigned")
10     private String id;
11
12     @JsonManagedReference
13     //@ManyToOne(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER)
14     @ManyToOne
15     @JoinColumn(name="DEPT_ID")
16     private Dept dept;
17
18     @OneToOne(cascade=CascadeType.ALL)
19     //@OneToOne
20     @JoinColumn(name="USER_ID")
21     private Userinfo userinfo;
22
23     @JsonBackReference
24     @ManyToMany(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER)
25     //@ManyToMany
26     @JoinTable(name="ROLE_USER_P",joinColumns= {@JoinColumn(name="USER_ID",referencedColumnName="USER_ID")},
27     inverseJoinColumns= {@JoinColumn(name="ROLE_ID",referencedColumnName="ROLE_ID")})
28     @OrderBy("ORDER_NO")
29     private Set<Role> roles= new HashSet<>();        //用户对应角色
30
31     @Column(name="USER_NAME")
32     private String userName;
33
34     @Column(name="PASSWORD")
35     private String password;
36
37     @Column(name="STATE")
38     private Integer state;
39
40     //getter和setter方法
41 }
42
43 @Entity
44 @Table(name="ROLE_P")
45 @DynamicInsert(true)
46 @DynamicUpdate(true)
47 public class Role extends BaseEntity {
48     @Id
49     @Column(name="ROLE_ID")
50     @GeneratedValue(generator="system-uuid")
51     @GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator")
52     private String id;        //角色ID
53
54     @JsonBackReference
55     @ManyToMany(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER)
56     @JoinTable(name="ROLE_USER_P",joinColumns= {@JoinColumn(name="ROLE_ID",referencedColumnName="ROLE_ID")},
57     inverseJoinColumns= {@JoinColumn(name="USER_ID",referencedColumnName="USER_ID")})
58     private Set<User> users = new HashSet<>(0);        //用户对应角色
59
60     @Column(name="NAME")
61     private String name;        //角色名称
62
63     @Column(name="REMARK")
64     private String remark;        //备注
65
66     @Column(name="ORDER_NO")
67     private Integer orderNo;    //排序号
68
69     //getter和setter方法
70 }

  一个新的xml文件 beans-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"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    <!-- 配置Spring整合shiro -->
    <!-- 配置安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 自定义realm域对象 -->
        <property name="realm" ref="authRealm" />
    </bean>

    <!-- 编写realm类 -->
    <bean id="authRealm" class="cn.ssm.trading.shiro.AuthRealm" />

    <!-- Spring框架整合Shiro框架 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 安全管理器 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 登陆页面 -->
        <property name="loginUrl" value="/login.jsp" />
        <!-- 认证成功跳转页面 -->
        <!-- <property name="successUrl" value="/index.jsp" /> -->
        <!-- 无权限跳转页面 -->
        <property name="unauthorizedUrl" value="/html/unauthorized.jsp" />
        <!-- 定义访问规则 -->
        <property name="filterChainDefinitions">
            <value>
                <!-- anon:不用认证, authc:需认证 -->
                /login.jsp = anon
                /login* = anon
                /logout* = anon
                /css/** = anon
                /img/** = anon
                /js/** = anon
                /images/** = anon
                /js/** = anon
                /json/** = anon
                /make/** = anon
                /skin/** = anon
                /static/** = anon
                /resource/** = anon
                /html/** = authc
                /** = authc
                /*.* = authc
            </value>
        </property>
    </bean>
</beans>

在spring配置文件中(配置了aop、事务管理、数据源的那个文件)加上:

<!-- 导入shiro配置文件 -->  

  <import resource="classpath:beans-shiro.xml"/>

  <!-- 产生shiro核心控制器的方式,使用cglib生成代理 -->
  <aop:aspectj-autoproxy proxy-target-class="true" />

二、shiro过滤器 配置在web.xml中 放在springmvc分发器前

    <!-- Shiro核心控制器,表示由spring管理生命周期 -->
    <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>

三、开启注解

在springmvc的配置文件中(配置了视图解析器的那个文件)加入:

    <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

    <!-- 生成代理,通过代理进行控制 -->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true" />
    </bean>

    <!-- 安全管理器 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>
    <!-- 异常处理(无权限) -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="org.apache.shiro.authz.UnauthorizedException">
                    /unauthorized.jsp
                </prop>
                <prop key="org.apache.shiro.authz.UnauthenticatedException">
                    redirect:/login.jsp
                </prop>
            </props>
        </property>
        <property name="defaultErrorView" value="/error.jsp" />
        <property name="exceptionAttribute" value="ex" />
    </bean>

四、认证 授权方法 编写AuthRealm类(即‘域‘ )

 1    public class AuthRealm extends AuthorizingRealm{  2
 3     @Resource
 4     UserService userService;
 5
 6     @Override
 7     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
 8         System.out.println("授权方法");
 9         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
10         User user = (User) arg0.getPrimaryPrincipal();   //获得当前登陆的用户
11         Set<Role> roles = user.getRoles();          //当前用户拥有的角色,根据自己的entity
12         //指示当前用户能访问的资源
13         for(Role role : roles) {
14             info.addStringPermission(role.getName());
15         }
16         return info;
17     }
18
19     @Override
20     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
21         System.out.println("认证方法");
22         UsernamePasswordToken token =(UsernamePasswordToken)arg0;
23         final String username = token.getUsername();
24                //fibd的查询条件
25         Specification<User> spec = new Specification<User>() {
26             @Override
27             public Predicate toPredicate(Root<User> arg0, CriteriaQuery<?> arg1, CriteriaBuilder arg2) {
28                 // TODO 自动生成的方法存根
29                 return arg2.equal(arg0.get("userName").as(String.class), username);
30             }
31         };
32         List<User> userList = userService.find(spec);      //jpa,即在数据中找到满足条件的用户
33         if(userList!=null&&userList.size()>0) {
34             User user = userList.get(0);
35             //参数1:登陆的用户,参数2:密码,参数3:区分realm
36             return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
37         }
38
39         return null;
40     }
41 }

五、登陆认证方法(在controller中)

 1     @RequestMapping("/security/login.action")
 2     public String login(String username,String password) {
 9         Subject subject = SecurityUtils.getSubject();
10         UsernamePasswordToken token = new UsernamePasswordToken(username,password);    //新建令牌
11         try {
12             subject.login(token);                                  //会去调用认证方法16             return "redirect:/index.jsp";
17         }catch(Exception e) {19             return "redirect:/login.jsp";                             //认证失败会抛出异常
20         }
21     }

六、授权

1、使用标签

  现在页面中引入shiro标签 <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

  例如:<shiro:hasPermission name=‘权限名‘> 有该权限这里的内容才会显示 </shiro:hasPermission>

  其中name属性:由于我们在上面的授权方法中加入当前用户所拥有的权限了 “info.addStringPermission(role.getName());”,所以此时会去判断name所写的权限名,当前用户是否拥有;

  更多标签请自行查阅文档;

2、使用注解

在controller相应的方法上加上

1     @RequestMapping("/list.action")
2     @RequiresPermissions("权限名")
3     public String list(Model model) {
4             ....
5     }  

当访问该方法时,会去判断当前用户是否拥有该权限;

若无则抛出异常,会被上面spring-mvc配置文件中所写的“异常处理”类拦截,然后转向相应页面。

原文地址:https://www.cnblogs.com/Drajun/p/10325407.html

时间: 2024-11-05 20:44:05

SSM中shiro的基本使用的相关文章

[Shiro] - shiro之SSM中的使用

在学习shiro的途中,在github发现了一个开源项目,所需的控件刚好是自己要学习的方向. 虽然还要学习完ssm的shiro与springboot的shiro,以及接下来的种种控件和类库,但学习这个开源项目刻不容缓 [SSM的shiro使用] SSM简单的说,就是SpringMVC负责web部分,mybatis负责数据库部分,否则没有mybatis要写的jdbc是很费时间的. 所以基于ssm的shiro项目,就是Servlet部分修改为SpringMVC,数据库部分,修改为Mybatis,然后

SSM整合shiro

2.3.SSM整合 Shiro 的组件都是 JavaBean/POJO 式的组件,所以非常容易使用 Spring 进行组件管理,可以非常方便的从 ini 配置迁移到 Spring 进行管理,且支持 JavaSE 应用及 Web 应用的集成. 2.3.1.pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

ssm整合shiro时web。xml中配置filter,tomcat报错

当我们使用ssm框架整合进行项目开发,使用Shiro作为安全验证管理,在web.xml中配置Shiro过滤器后 启动Tomcat会报错: Error during artifact deployment. See server log for details. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property na

SSM(三)Shiro使用详解

前言 相比有做过企业级开发的童鞋应该都有做过权限安全之类的功能吧,最先开始我采用的是建用户表,角色表,权限表,之后在拦截器中对每一个请求进行拦截,再到数据库中进行查询看当前用户是否有该权限,这样的设计能满足大多数中小型系统的需求.不过这篇所介绍的Shiro能满足之前的所有需求,并且使用简单,安全性高,而且现在越来越的多企业都在使用Shiro,这应该是一个收入的你的技能库. 创建自定义MyRealm类 有关Shiro的基础知识我这里就不过多介绍了,直接来干货,到最后会整合Spring来进行权限验证

java 微信自定义菜单 java微信接口开发 公众平台 SSM redis shiro 多数据源

获取[下载地址]   QQ: 313596790官网 http://www.fhadmin.org/A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

ssm中逆向工程与分页的应用

昨天对springboot中的mybatis逆向工程与分页应用进行了整理,今天对ssm项目中的逆向工程与分页进行整理. 项目运行环境:eclipse+jdk1.8+maven+tomcat 搭建ssm项目 首先新建maven project,项目Archetype选择:maven-archetype-webapp,项目新建完毕,会出现生成的index.jsp报错. 造成原因:项目没有依赖javax.servlet相关类包,这些类包在tomcat类库中 有两种解决方案: 方法一:添加依赖 <dep

SSM+Redis+Shiro+Maven框架搭建及集成应用

引文: 本文主要讲述项目框架搭建时的一些简单的使用配置,教你如何快速进行项目框架搭建. 技术: Spring+SpringMVC+Mybatis+Redis+Shiro+Maven            mybatis.redis都是使用spring集成 技术介绍就不再讲述了,话不多说,急忙上代码了. 1.新建Web项目使用Maven 进行项目管理 具体步骤不进行讲述.... 主要配置 web.xml 文件 1 <?xml version="1.0" encoding="

SSM中的MVC结构分析,SSM框架的响应流程

今天头一次配置成功一个SSM框架,兴奋之余,还应该从使用的角度,将整个ssm配置的方法,配置的原因,认真的分析一下.在结束了对SSM框架简单的分析之后,就要开始回归基础,全面的认真复习.所以这个文档,要尽量的完整,目标就是,这个文档是是对SSM框架的学习,也是一个将来复习的资料. 这个版本中的代码貌似无法复制,我将可以也可复制版也发布了,在我的博客中,但是没有很好的样式. 1 resources 配置文件 1.1 配置文件简介 这个部分用来解读在resources文件夹下的配置信息.这一部分是整

SSM中excel的导出以及poi的使用

首先,这是我对自己的需求而使用的逻辑,若有可以完美的地方方便告诉下小白. MAVEN <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> 1.前端页面,伪异步(页面不刷新) 为什么不用ajax呢? JQuery的ajax函数的返回类型只有