<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.mldn.dao.IMemberDAO">
<insert id="doCreate" parameterType="Member">
INSERT INTO member(mid,name,age,salary,birthday,note)
VALUES (#{mid},#{name},#{age},#{salary},#{birthday},#{note});
</insert>
<select id="findAllSplit" parameterType="java.util.Map" resultType="Member">
SELECT mid,name,age,salary,birthday,note FROM member
<where>
<if test="column != null and keyword != null">
${column} LIKE #{keyWord}
</if>
</where>
LIMIT #{start},#{lineSize}
</select>
</mapper>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.mldn.dao.IMemberDAO">
<!-- 是进行登录认证使用的,即,根据身份信息取得密码进行认证 -->
<select id="findById" parameterType="String" resultType="Member">
SELECT mid,password,name FROM member WHERE mid=#{mid}
</select>
<!-- 根据用户名查询出该用户对用的所有角色的标记名称(千万不要用中文) -->
<select id="findAllRoleByMember" parameterType="String" resultType="String">
SELECT flag FROM role WHERE rid IN (
SELECT rid FROM member_role WHERE mid=#{mid}) </select>
<!-- 查询出一个用户对应的所有的权限数据 -->
<select id="findAllActionByMmember" parameterType="String" resultType="String">
SELECT flag FROM action WHERE actid IN (
SELECT actid FROM role_action WHERE rid IN (
SELECT rid FROM member_role WHERE mid = #{mid}))
</select> </mapper>

package cn.mldn.dao;

import java.util.Set;

import cn.mldn.vo.Member;

public interface IMemberDAO {
public Member findById(String mid);
public Set<String> findAllRoleByMember(String mid);
public Set<String> findAllActionByMember(String mid);
}

package cn.mldn.service;

import java.util.Map;

import cn.mldn.vo.Member;

public interface IMemberService {
/**
* 此方法是留给Realm进行用户认证使用的,目的是根据用户名取得密码数据
* @param mid
* @return
* @throws Exception
*/
public Member get(String mid) throws Exception;
/**
* 此方法是留给Realm实现授权处理的,主要要根据用户ID查询出所有的角色以及所有对应权限
* @param mid
* @return 返回的数据包含有两个内容:<br>
* <li>key = allRoles、value = 所有的用户角色:</li>
* <li>key = allActions、value = 所有的用户权限。</li>
* @throws Exception
*/
public Map<String,Object> listAuthByMember(String mid) throws Exception;
}

写实现子类的时候最好使用自动的注入方式完成。

package cn.mldn.service.impl;
import java.util.HashMap;
import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import cn.mldn.dao.IMemberDAO;
import cn.mldn.service.IMemberService;
import cn.mldn.vo.Member;
@Service
public class IMemberServiceImpl implements IMemberService {
@Resource
private IMemberDAO memberDAO ;
@Override
public Member get(String mid) throws Exception {
// TODO Auto-generated method stub
return this.memberDAO.findById(mid);
}
@Override
public Map<String, Object> listAuthByMember(String mid) throws Exception {
// TODO Auto-generated method stub
Map<String,Object> map = new HashMap<String,Object>();
map.put("allRoles", this.memberDAO.findAllRoleByMember(mid));
map.put("allActions", this.memberDAO.findAllActionByMember(mid));
return map;
}
}

package cn.mldn.realm;

import java.util.Map;
import java.util.Set; import javax.annotation.Resource; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
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.stereotype.Component; import cn.mldn.service.IMemberService;
import cn.mldn.service.MemberLoginService;
import cn.mldn.vo.Member;
@Component
public class MemberRealm extends AuthorizingRealm {
@Resource
private IMemberService memberService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
// TODO Auto-generated method stub
System.out.println("************* 1、用户登陆认证:doGetAuthenticationInfo() *************");
// 1、 登录认证的方法需要先执行,需要用他来判断登录的用户信息是否合法
String username = (String) token.getPrincipal();
// 需要通过用户名取得用户的完整信息,利用业务层操作
MemberLoginService service = new MemberLoginService();
//Member vo = new MemberLoginService().get(username); // 需要取得的是用户的信息
//Member vo = service.get(username); // 需要取得的是用户的信息
Member vo = null;
try {
vo = this.memberService.get(username);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//service.close();
if(vo == null) {
throw new UnknownAccountException("该用户名称不存在!");
} else { // 进行密码的验证处理
//String password = new String((char [])token.getPrincipal());
String password = new String((char []) token.getCredentials());
// 将数据库中的密码与输入的密码进行比较,这样就可以确定当前用户是否可以正常登陆
if (vo.getPassword().equals(password)){ // 密码正确
AuthenticationInfo auth = new SimpleAuthenticationInfo(username, password, "memberRealm");
return auth ;
} else {
throw new IncorrectCredentialsException("密码错误!");
}
}
}
@SuppressWarnings("unchecked")
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
// TODO Auto-generated method stub
System.out.println("*************2、用户角色与权限:doGetAuthorizationInfo() *************");
String username = (String) principals.getPrimaryPrincipal(); // 取得用户登录名
//AuthorizationInfo auth = new SimpleAuthorizationInfo(); // 定义授权信息的返回数据
SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo(); // 定义授权信息的返回数据
//MemberLoginService service = new MemberLoginService();// 进行业务层处理
try{
Map<String,Object> map = this.memberService.listAuthByMember(username);
//auth.setRoles(service.listRolesByMember(username));// 所有的角色必须以Set集合的形式出现
//auth.setStringPermissions(service.listActionsByMember(username));// 所有的权限必须以Set集合的形式出现
//auth.setRoles((Set<String>) map.get("allRoles"));// 所有的角色必须以Set集合的形式出现
//auth.setStringPermissions((Set<String>) map.get("allActions"));// 所有的权限必须以Set集合的形式出现 Set<String> allRoles = (Set<String>) map.get("allRoles");// 所有的角色必须以Set集合的形式出现
Set<String> allActions = (Set<String>) map.get("allActions");// 所有的权限必须以Set集合的形式出现
auth.setRoles(allRoles);// 所有的角色必须以Set集合的形式出现
auth.setStringPermissions(allActions);// 所有的权限必须以Set集合的形式出现
} catch (Exception e) {
e.printStackTrace();
}
//service.close();
return auth;
} }

Realm用@Component自动注入

    <!-- 配置SecuityManager的管理 -->
<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
<!-- 配置你需要使用的Realms -->
<property name="realm" ref="memberRealm"></property>
</bean>

         <!-- shiro里面需要针对于所有的路径进行配置,所有的配置需要通过文本的形式设置 -->
<property name="filterChainDefinitionMap">
<value>
/*=anon
/shiroLogin=anon
/messages/**=authc
/admin*=authc
/pages/welcome.jsp=authc,perms[member:add],perms[dept:add]
</value>
</property>

         <!-- shiro里面需要针对于所有的路径进行配置,所有的配置需要通过文本的形式设置 -->
<property name="filterChainDefinitionMap">
<value>
/*=anon
/shiroLogin.action=anon
/messages/**=authc
/admin*=authc
/pages/welcome.jsp=authc,perms[member:add],perms[dept:add]
</value>
</property>

不要用filterChainDefinitionMap,要用filterChainDefinitions

18.29SSM基础整合开发的更多相关文章

  1. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  2. Android NDK 和 OpenCV 整合开发总结(3)

    Android NDK 和 OpenCV 整合开发总结(3) http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-open ...

  3. MyBatis+Spring+Spring MVC整合开发

    MyBatis+Spring+Spring MVC整合开发课程观看地址:http://www.xuetuwuyou.com/course/65课程出自学途无忧网:http://www.xuetuwuy ...

  4. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  5. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  6. 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境

    做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...

  7. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  8. 【课程分享】ASP.NET MVC5&amp;微信公众平台整合开发实战(响应式布局、JQuery Mobile,Windows Azure、微信核心开发)

    对这个课程有兴趣的,能够联系我QQ2748165793 基础知识储备 ASP.NET MVC 5基础(6讲) 第一讲-初识ASP.NET MVC并搭建整合开发环境 第二讲-深入MVC开发模式 第三讲- ...

  9. 从MVC和三层架构说到SSH整合开发

    相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...

随机推荐

  1. 大白话理解cookie

    HTTP协议是一个无状态的协议,服务器无法区分出两次请求是否发送自同一服务器. 需要通过会话控制来解决这个问题,会话控制主要有两种方式Cookie 和 Session. Cookie就是一个头,Coo ...

  2. 解决无法移除tomcat中的项目

    问题:启动myeclipse,tomcat提示报错,blind,但是你移除的时候无法移除,只会显示一个黄色的感叹号,此时你直接在webapp中删除时,也提示呗占用无法删除. 办法:关掉myeclips ...

  3. C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

    //1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...

  4. dubbo之直连提供者

    在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获 ...

  5. Canopy聚类算法分析

          原文链接:http://blog.csdn.net/yclzh0522/article/details/6839643 Canopy聚类算法是可以并行运行的算法,数据并行意味着可以多线程进 ...

  6. linux下怎么退出telnet

    在运维过程中,常常会telnet某个ip端口,如果 能telnet通,怎么退出呢 ? 1.telnet 63.172.25.18 6463 回车 Trying 63.172.25.18... Conn ...

  7. python tips:作用域与名字空间

    Python具有静态作用域,变量的作用域由它定义的位置决定,而与调用的位置无关. a = 2 def f(): a = 2 第一行的a的作用域是全局作用域,作用于定义位置后面的所有位置. 第四行的a的 ...

  8. 【ubuntu子系统】使用windows自带的ubuntu子系统

      在windows10系统中,自带了一款ubuntu子系统,就像是一个应用程序,一款软件,提供ubutnu的terminal窗口,可以使用对应的命令行模式.最重要的是,可以直接用来连接linux服务 ...

  9. [CodeForces]1059C Sequence Transformation

    构造题. 我递归构造的,发现如果N>3的话就优先删奇数,然后就把删完的提取一个公约数2,再重复操作即可. 具体原因我觉得是因为对于一个长度大于3的序列,2的倍数总是最多,要令字典序最大,所以就把 ...

  10. Python语言简介

    一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号“龟叔”,圣诞节期间开始编写Python语言的编译器. Python这个名字,来自Guido所挚爱的电视 ...