下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章

当然,同时也可以参考MyBatis Plus官方教程

建议如果参考如下教程,使用的技术为spring+mybatis plus + springmvc+jdk8+maven工程

满足这个条件可以减少不必要的麻烦,当然持久层也可以用mybatis。

只要按照如下示例来,也不会有大问题的。之前我也强调过mybatis和mybatis plus的区别主要是封装和继承,mybatis plus封装一系列增删改查的方法,但是这些封装方法都是靠继承。而mybatis的代码生成器就得逆向工程,当然,也可以通过这种方式,使用volocity或freemarker模板引擎,编写对应的模板(含xml,entity,service,serviceImpl,controller等),这种模板引擎的机制也涉及到Java的反射。

关于shiro教程,可以参考官网,也可以参考我的shiro实战系列,我的shiro实战系列主要参考张开涛先生的文档和github相关的教程

文档的话,大家可以参考:Java相关框架资料及其基础资料、进阶资料、测试资料之分享

通过该篇文章获取资料,包含视频等相关资料

张开涛先生的github系列地址如下:

https://github.com/zhangkaitao/shiro-example

张开涛先生的shiro博客文章系列地址如下:

http://jinnianshilongnian.iteye.com/blog/2049092

上述列出的,可以作为朋友们的学习参考,当然技术每时每刻不在更新,但是底层原理却是不变的。

关于shiro和Java流行框架(Spring+SpringMVC+MyBatis或SpringBoot等案例)

大家可以去github上找,或者直接去码云上借鉴。

码云上的案例都还不错,感谢开源并乐于分享的程序爱好者们。

至于博客文章,几年前的和现在的shiro相关案例,大家都可以参考借鉴。

为了不做拿来主义,我觉得有必要分享分享,即便相关的案例比较多,但是每篇博文我想都从不同的角度看待shiro。

俗话说:对于哈姆莱特,一千个读者有一千个体会。

至于原话是否如此,我也懒得百度搜索了,总而言之每个编程爱好者们对于技术,都有自己的视角。

一、导入依赖

            <!-- shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>

二、自定义Realm

package com.shiro;

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.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import com.dao.UserDao;
import com.entity.UserEntity; public class MyRealm extends AuthorizingRealm { @Autowired
private UserDao userDao; /**
* 密码匹配凭证管理器
*
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// 采用MD5方式加密
hashedCredentialsMatcher.setHashAlgorithmName("MD5");
// 设置加密次数
hashedCredentialsMatcher.setHashIterations(1024);
return hashedCredentialsMatcher;
} @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); info.addStringPermission("sys"); System.out.println("开始授权"); return info;
} @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken=(UsernamePasswordToken) token; String username=upToken.getUsername(); String password=new String(upToken.getPassword()); UserEntity user=new UserEntity(); user.setLoginName(username); user=userDao.selectOne(user); System.out.println("==========="); if(user!=null){ if(user.getPassword().equals(password)){ return new SimpleAuthenticationInfo(username,password,getName()); } } throw new UnauthenticatedException();
} }

三、spring-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:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="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.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<!-- 自定义Realm -->
<bean id="myRealm" class="com.shiro.MyRealm"/>

<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>

<!-- Shiro过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<property name="securityManager" ref="securityManager"/>
<!-- 身份认证失败,则跳转到登录页面的配置 -->
<property name="loginUrl" value="/login.html"/>
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/login.html"/>
<!-- Shiro连接约束配置,即过滤链的定义 -->
<property name="filterChainDefinitions">
<value>
/login.html=anon
/index.html=anon
/**=authc
</value>
</property>
</bean>

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

<!-- 开启Shiro注解 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
</beans>

四、web.xml内容

<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
<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>

五、测试相关的实体类及其DAO、Service等

UserEntity.java

package com.entity;

import java.io.Serializable;

import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName; @TableName("user")
public class UserEntity extends Model<UserEntity> { /**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
@TableField("login_name")
private String loginName;
private String password; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getLoginName() {
return loginName;
} public void setLoginName(String loginName) {
this.loginName = loginName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
protected Serializable pkVal() {
// TODO Auto-generated method stub
return id;
} }

UserDao.java

package com.dao;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.entity.UserEntity; public interface UserDao extends BaseMapper<UserEntity>{ }

UserService.java

package com.service;

import com.baomidou.mybatisplus.service.IService;
import com.entity.UserEntity; public interface UserService extends IService<UserEntity>{ }

UserServiceImpl.java

package com.service.impl;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.UserDao;
import com.entity.UserEntity;
import com.service.UserService;
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService { }

UserDao.xml

<?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.dao.UserDao"> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.entity.UserEntity">
<id column="id" property="id" />
<result column="login_name" property="loginName" />
<result column="password" property="password" /> </resultMap> </mapper>

 

最后,我想说的是,大家尽可能学习参照官网,毕竟官网是比较权威比较全面的。

当然,对于完全不懂不知道的,可以通过视频或者文档及入门程序达到有使用并了解的程度,然后在这个基础上多深入。当然,任何一门技术学习和使用过程中,问题总会不断的。

没关系,问题多,虽然挺操蛋的,但是越是觉得难受不爽,我想这就是上升带来的阻力和痛苦吧。就好比修仙者们,修仙的过程是痛苦的,当达到一定的程度时,就会天外飞仙,直达天堂。

哈哈,说过了。

总而言之,希望个人的小小分享,能给大家带来帮助。

MP实战系列(九)之集成Shiro的更多相关文章

  1. MP实战系列(二)之集成swagger

    其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...

  2. MP实战系列(七)之集成springboot

    springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发.当然有 ...

  3. MP实战系列(十四)之分页使用

    MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...

  4. MP实战系列(十二)之封装方法详解(续二)

    继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后. 此次要讲的是关于查询. 查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事. 1.selectB ...

  5. MP实战系列(十)之SpringMVC集成SpringFox+Swagger2

    该示例基于之前的实战系列,如果公司框架是使用JDK7以上及其Spring+MyBatis+SpringMVC/Spring+MyBatis Plus+SpringMVC可直接参考该实例. 不过建议最好 ...

  6. MP实战系列(八)之SpringBoot+Swagger2

    SpringBoot一个原则,爱好编程的朋友们都知道,那就是"习惯优于配置". 今天一上来主要说的还是代码,个人比较喜欢来的实战系列的,不过有的时候还是比较偏重于理论,理论是造轮子 ...

  7. ElasticSearch实战系列九: ELK日志系统介绍和安装

    前言 本文主要介绍的是ELK日志系统入门和使用教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一 ...

  8. MP实战系列(三)之实体类讲解

    首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomido ...

  9. shiro实战系列(九)之Web

    一.Configuration(配置) 将 Shiro 集成到任何 Web 应用程序的最简单的方法是在 web.xml 中配置 ContextListener 和 Filter,理解如何读取 Shir ...

随机推荐

  1. Java基础——线程

    一. 进程 是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程. 比如在Windows系统中,一个运行的exe就是一个进程. 二.线程 是指进程中的一个执行流 ...

  2. HDFS 命令大全

    目录 概要 用户命令 dfs 命令 追加文件内容 查看文件内容 得到文件的校验信息 修改用户组 修改文件权限 修改文件所属用户 本地拷贝到 hdfs hdfs 拷贝到本地 获取目录,文件数量及大小 h ...

  3. Vue, element-ui Module build failed: Error: No PostCSS Config found

    使用vue框架写pc页面时,我们经常会用到element-ui这个框架. 当我们吧把需要的东西都装在好运行项目的时候,有时会出现这样的错误, Module build failed: Error: N ...

  4. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  5. 微信小程序-上传照片-多张显示

    图片就是一个简单的效果 实现 先看wxml和wxss代码 <view class='in-demand'> <view class='dema-title'> <text ...

  6. mongodb与mysql区别(超详细)

    MySQL是关系型数据库. 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺 ...

  7. hihocoder [Offer收割]编程练习赛12 [1495] ---- 矩形分割

    原题链接 矩形分割 算法分析: 解决该题要用到"并查集"的思想. 这里有一篇不错的博客介绍并查集: 并查集(Union-Find)算法介绍 记 int total=N*M,这里会有 ...

  8. GDAL打开HDF格式时遇到的中文路径问题(未解决)

    众所周知,中文环境下(VS2010 C++工程编码为多字节编码),在使用1.8.0版本以后的GDAL打开中文路径下的影像文件(如GeoTiff文件)时, 需对中文文件路径做特殊处理,有2种方法:(我使 ...

  9. python学习笔记——python JSON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 1.JSON 函数 使用 JSON 函数需要导入 json 库:import json ...

  10. python3+unittest+HTMLTestRunner

    参考博客1 参考博客2 python3版HTMLTestRunner.py见博客园‘链接’(已经上传到博客园) import unittest class operatinon_unittest(un ...