书接上回 构建 struts2 spring3 mybatis 的maven项目 构建 pom.xml

继续在原有框架下 融合shiro ,具体shiro是啥 这里就不解释了,恩 反正功能挺强大的

本着先会用再深入的原则,还是尝试着将shiro融入框架中

0 首先上下这个项目的整体结构图

aaarticlea/png;base64,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" alt="" width="237" height="503" />

1 在导入shiro的jar包  在pom.xml中添加shiro的配置

...
<shiro.version>1.2.1</shiro.version>
...
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
</dependencies>

2 在web.xml中导入 shiro的过滤器

<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

这里要说明一下

shiro的过滤器是前置过滤器,需要添加在struts2的前面,如果放在struts2之后会报错

然后是在spring的过滤配置中添加spring-shiro的配置文件

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-*.xml
</param-value>
</context-param>

配置文件为applicationContext-shiro.xml, 因为这里用了通配符 所以不用修改

3 然后 添加spring-shiro的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans...> <description>Shiro安全配置 来源于: http://shiro.apache.org/spring.html </description> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="shiroDbRealm" />
</bean>
<bean id="shiroDbRealm" class="lqb.shiro.ShiroDbRealm" />
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login_loginPage.do" /> <!-- 没有权限或者失败后跳转的页面 -->
<property name="successUrl" value="/login_home.do" />
<property name="unauthorizedUrl" value="/other_error.do"/>
<property name="filterChainDefinitions">
<value> /login_loginPage.do = anon /login_login.do = anon
/login_home.do=authc
/login_hello.do=authc /t1/**=roles[aa],perms[aaa]
/t2/**=roles[bb],perms[baaa]
/t3/**=roles[dd] </value>
</property>
</bean> <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- AOP式方法级权限检查 -->
<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> </beans>

这里需要就是下 filterChainDefinitions 的value

  key 是 对应的跳转路径 这里都是指定的struts2的跳转 可以匹配通配符 *

  value 是对应的过滤权限

    anon 不需要验证

    authc 需要登录验证

    roles[aa] 角色验证 中括号内为指定的角色

    perms[aaa] 权限验证 中括号内卫指定的权限

4 添加shiro的缓存配置文件

<ehcache>
<diskStore path="java.io.tmpdir/shiro-spring-sample"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/> <cache name="shiro-activeSessionCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600"/> <cache name="org.apache.shiro.realm.SimpleAccountRealm.authorization"
maxElementsInMemory="100"
eternal="false"
timeToLiveSeconds="600"
overflowToDisk="false"/>
</ehcache>

5 角色 权限 实现

因为只是一个demo  所以就没有弄角色表和权限表  只是模拟了一下 用户--角色--权限 的5表结构

用户是查的表 角色和权限只是假实现

6 修改 struts.xml

<struts>
<!-- 全局包设置 -->
<package name="defalutGlobal" namespace="/" extends="json-default"> </package>
<!-- 自定义开发包 -->
<package name="myDefault" extends="defalutGlobal">
<!--登录Action -->
<action name="login_*" class="loginAction" method="{1}" >
<result name="loginPage">WEB-INF/pages/login.html</result>
<result name="loginPageForm">WEB-INF/pages/login2.html</result>
<result name="home">WEB-INF/pages/home.html</result>
<result name="hello">WEB-INF/pages/hello.html</result> <result name="success" type="json">
<param name="root">jsonResult</param>
</result> </action> <action name="other_*" class="otherAction" method="{1}">
<result name="error">WEB-INF/pages/other/error.html</result>
</action>
</package> <package name="t1" extends="defalutGlobal" namespace="/t1">
<action name="t1_*" class="test1Action" method="{1}">
<result name="t1">/WEB-INF/pages/t1/t1.html</result>
<result name="t2">/WEB-INF/pages/t1/t2.html</result>
<result name="t3">/WEB-INF/pages/t1/t3.html</result>
<result name="toT2" type="redirect" >/t2/t2_t2.do</result> </action>
</package>
<package name="t2" extends="defalutGlobal" namespace="/t2">
<action name="t2_*" class="test2Action" method="{1}">
<result name="t1">/WEB-INF/pages/t2/t1.html</result>
<result name="t2">/WEB-INF/pages/t2/t2.html</result>
<result name="t3">/WEB-INF/pages/t2/t3.html</result>
</action>
</package>
<package name="t3" extends="defalutGlobal" namespace="/t3">
<action name="t3_*" class="test3Action" method="{1}">
<result name="t1">/WEB-INF/pages/t3/t1.html</result>
<result name="t2">/WEB-INF/pages/t3/t2.html</result>
<result name="t3">/WEB-INF/pages/t3/t3.html</result>
</action>
</package> </struts>

这里为了更好地测试shiro的权限角色控制 所以把 t1,t2,t3加了namespace

7 添加html

这里就没啥说的了  给个缩略图吧

8 实现reaml

public class ShiroDbRealm extends AuthorizingRealm {

    @Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private PermissionService permissionService; /**
* 认证回调函数,登录时调用.
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
User user = userService.getByUserName(token.getUsername());
if (user != null) {
return new SimpleAuthenticationInfo(new ShiroUser(user.getUsername(), user.getNickname()), user.getPassword(),getName());
} else {
return null;
}
} /**
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 加载用户的roles
List<Role> roles = roleService.getByUserName(shiroUser.username);
List<String> stringRoles = new ArrayList<String>(roles.size());
for (Role role : roles) {
stringRoles.add(role.getRolename());
}
info.addRoles(stringRoles); // 加载用户的permissions
List<Permission> permissions = permissionService.getByUserName(shiroUser.username);
Set<String> stringPermissions = new HashSet<String>(permissions.size());
for (Permission permission : permissions) {
stringPermissions.add(permission.getPermissionname());
}
info.setStringPermissions(stringPermissions); return info;
} /**
* 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息.
*/
public static class ShiroUser implements Serializable {
private static final long serialVersionUID = -1373760761780840081L;
private String username;
private String nickname; public ShiroUser(String username, String nickname) {
this.username = username;
this.nickname = nickname;
}
    /**------getset略--------*/
}
}

9 action

public class LoginAction extends BaseAction{

    private String username;
private String password;
@Autowired
UserService userService; /**
* 登录页面
*/
public String loginPage(){return "loginPage";
} /**
* home页面
*/
public String home(){
return "home";
} /**
* hello页面
*/
public String hello(){
System.out.println(SecurityUtils.getSubject().hasRole("cc"));
return "hello";
} /**
* 登录
*/
public String login(){
Map<String,Object> map = new HashMap<String,Object>();
User u=new User(getUsername(),getPassword());
u=userService.check(u);
if("0".equals(u.getRes())){
map.put("res", "true");
AuthenticationToken token = new UsernamePasswordToken(username,password);// username和password是从表单提交过来的
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token); }else{
map.put("res", "false");
}
JSONObject json = JSONObject.fromObject(map);//将map对象转换成json类型数据
setJsonResult(json.toString());//给result赋值,传递给页面
return "success";
} /**
* 登录页面
*/
public String loginPageForm(){
String result="loginPageForm";
return result;
}
/**
* 登录
*/
public String loginForm(){
System.out.println("loginForm");
String result="loginPageForm";
User u=new User(getUsername(),getPassword());
u=userService.check(u); if("0".equals(u.getRes())){
AuthenticationToken token = new UsernamePasswordToken(username,password);// username和password是从表单提交过来的
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
result="home";
} return result;
} /**
* 登出
*/
public String logout(){
Subject currentUser = SecurityUtils.getSubject();if (currentUser.isAuthenticated()) {
currentUser.logout(); // session 会销毁,在SessionListener监听session销毁,清理权限缓存
if (LOG.isDebugEnabled()) {
LOG.debug("用户" + username + "退出登录");
}
}return "loginPage";
}

  /**--------getset略----------*/
}

这里就只上LoginAction了 其他的action 只是实现的跳转没有啥实际操作 就略过了

如果先看其他action 就只能下源码了

这里还要说一下 登录页面写了两个 一个是ajax的一个是form 没有啥特别的 只是为了之后学习shiro remberme功能 打个提前量

10 数据库结果

create table base_user
(
id int not null auto_increment,
createtime char(20),
username char(20),
password char(20),
nickname char(20),
t1 char(100),
t2 char(30),
primary key (id)
);

好 完成 测试下 成功

最后总结下

1 不得不吐槽下 网上的关于shiro的教程虽然不算少 但大都是 springMVC的 关于struts2的还是比较少的

2 文档还是官方的好  放一个中文的shiro参考手册 下载

3 本人研究shiro时间不长 这里只是作为一个入门参考 如果文中有错误的地方 尽情支出 欢迎技术喷子

4 下次打算把shiro的 rememberme等功能研究下 再写一篇

5 本项目 下载

构建 shiro struts2 spring3 mybatis 的maven项目的更多相关文章

  1. 构建 struts2 spring3 mybatis 的maven项目 构建 pom.xml

    学习maven项目时 搭建个ssm项目 算是给自己留个备份吧 环境说明: MyEclipse10 Maven   3.2.3 框架: struts2    2.3.24.1 spring3    3. ...

  2. Mybatis、maven项目中整合log4j (17)

    Mybatis.maven项目总整合log4j java 中Mybatis.maven项目总整合log4j 1.pom增加log4j包引用 2.添加 log4j.properties文件 # java ...

  3. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  4. Mybatis在Maven项目中使用

    Mybatis概览 ORM是什么? ORM是Object Realtion Mapping的缩写,顾名思义,即对象关系映射. ORM是一种以面向对象的方式来进行数据库操作的技术.Web开发中常用的语言 ...

  5. 搭建springboot的ssm(spring + springmvc + mybatis)的maven项目

    最终项目目录结构 创建过程 1.创建开关SpringBootApplication 为了创建快速.我们使用idea自带的创建springboot来创建结构,当然创建普通的web项目也是可以的.(使用e ...

  6. 利用 SonarScanner 静态扫描 Rainbond 上的 Maven 项目

    对代码进行静态扫描是一种非常常见的代码质量保证手段,这种扫描不仅仅可以检查到代码中的缺陷,应用各种业界最佳实践,也可以检查出安全方面的漏洞,给予项目代码全方位的提升.在各种代码扫描方案之中,Sonar ...

  7. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  8. Struts2+Spring3+Hibernate3+Maven构建(基于Eclipse)

    长时间不做后台了,整理一下资料,以便翻阅. Eclipse.JDK安装略…… Maven下载地址:http://maven.apache.org/download.cgi 版本比较新的Eclipse基 ...

  9. 【转】使用Eclipse构建Maven项目 (step-by-step)

    安装eclipse 及配置maven时,参考的资料!!! from:http://blog.csdn.net/qjyong/article/details/9098213 Maven这个个项目管理和构 ...

随机推荐

  1. oracle flashback

    一.Flashback闪回技术概述:当Oracle数据库发生逻辑错误时,必须使用flashback技术,实现快速和方便的恢复数据.对于人为错误,要确定受到错误事务影响的对象或者记录是非常困难的.使用f ...

  2. oc学习之路----APNS消息推送从证书到代码(2015年4月26号亲试可用)

    前言:看这篇博客之前要准备:首先的有一个99刀的个人开发者账号或者199刀的企业开发者账号,其次你用的是apns消息推送,(本人之前四处打听有没有其他消息推送的方法:收获如下:首先如果想做到apns的 ...

  3. jQuery中get与eq的区别

    get与eq的区别 .eq() 减少匹配元素的集合,根据index索引值,精确指定索引对象. .get() 通过检索匹配jQuery对象得到对应的DOM元素. 同样是返回元素,那么eq与get有什么区 ...

  4. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  5. PHP中如何防止SQL注入

    这是StackOverFlow上一个投票非常多的提问 How to prevent SQL injection in PHP?  我把问题和赞同最多的答题翻译了下来. 提问:如果用户的输入能直接插入到 ...

  6. Cocos2d-x 2.0 自适应多种分辨率

    转自:http://dualface.github.io/blog/2012/08/17/cocos2d-x-2-dot-0-multi-resolution/ cocos2d-x 2.0 提供一个极 ...

  7. 适合高级Java程序员看的12本书

    1.Thinking in Java 2.Head First Java 3.Java in a Nutshell 4.The elements of Java style 5.Effective J ...

  8. VS2005配置CPPUnit进行单元測试

    一. 编译CPPUnitproject 1.  解压文件cppunit-1.12.1.tar.gz. 2.  编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cpp ...

  9. [Javascript] Drawing Paths - Lines and Rectangles

    <!DOCTYPE html> <html> <head> <meta name="description" content=" ...

  10. mac上SVN项目管理,提示被锁定的解决方法

    问题 mac上SVN项目管理,提示被锁定.不能commit.也不能update.提示 clean the working copy and then. .. 解决方法 watermark/2/text ...