您的位置:首页 > 其它

ssm环境下快速搭建shiro框架

2017-08-09 00:00 507 查看
摘要: shiro,springmvc

1. 引入pom文件:

版本号: <shiro.version>1.2.3</shiro.version>

<!-- shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</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-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-quartz</artifactId>
<version>${shiro.versio

2. 在web.xml文件中配置过滤器:

<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3. 在spring文件中配置:

(如果单独创建文件spring-shiro.xml 项目启动后会出现数据库访问用户错误的现象.建议与spring-mybatis文件写在一起,在datasource配置之后.)

<!-- shiro -->
(注意:该过滤器名称需要与web.xml文件中的过滤器名称相同)
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器对象 -->
<property name="securityManager" ref="securityManager"></property>
<!-- 登录页面url地址 -->
<property name="loginUrl" value="/front/login"></property>
<!-- 成功页面 -->
<property name="successUrl" value="/front/index"></property>
<!-- 失败页面 -->
<property name="unauthorizedUrl" value="/front/login"></property>
<!-- 基于url拦截,使用过滤器进行拦截 -->
<property name="filterChainDefinitions">
<value>
/styless/** = anon
/images/** = anon
/javascripts/** = anon
/open/** = anon
/forward/** = anon
<!-- 表示改路径需要staff权限才能访问 -->
- /front/index= perms["staff"]
/** = authc <!-- 表示需要认证才能登陆 -->
</value>
</property>
</bean>

<!-- 配置安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager ">
<property name="realm" ref="realmzhihu"></property>
<!-- 配置缓存管理器 -->
<property name="cacheManager" ref="cacheManager"></property>
</bean>
(注意:需要缓存文件)
<!-- 缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
</bean>

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--session的失效时长,单位毫秒 -->
<property name="globalSessionTimeout" value="600000"/>
<!--删除失效的session-->
<property name="deleteInvalidSessions" value="true"/>
</bean>

<!-- 配置Realm(认证和授权方法) -->
<bean id="realmzhihu" class="com.julian.shiro.RealmZhihu"></bean>

<!-- 配置注解权限,自动代理 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!-- 指定使用cglib创建代理 -->
<property value="true" name="proxyTargetClass"/>
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>

4 创建一个继承AuthorizingRealm的类:

(需要重写认证和授权方法)

/**
* 认证方法
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken myToken= (UsernamePasswordToken) token;
String username = myToken.getUsername();
char[] password = myToken.getPassword();
Manager mg=new Manager();
mg.setUsername(username);
List<Manager> selectAllManager = managerService.selectAllManager(mg);
if (selectAllManager.size() <= 0) {
return null;
}
/**
*参数说明
*1签名对象,认证通过之后可在程序的任意位置获取该对象
*2数据库中查询的密码
*3当前realm的类名
*/
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(selectAllManager.get(0), selectAllManager.get(0).getPassword(), this.getClass().getName());

return info;
}

/**
* 授权方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
//授权信息对象
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//根据当前登录用户查询数据库,获得其对应的权限
Manager user=(Manager) principals.getPrimaryPrincipal();
if(user.getUsername().equals("admin")){
//超级管理员,查询所有权限
List<Function> list = functionService.findAllFunctions();
for (Function function : list) {
info.addStringPermission(function.getFunctionCode());
}
}else{
//普通用户,根据用户查询对应的权限
List<Function> list = functionService.findFunctionsByUserId(user.getId());
for (Function function : list) {
info.addStringPermission(function.getFunctionCode());
}
}
return info;

}

4. 如何调用认证方法:

(注意:在过滤器中authc,表示需要认证才可以访问,而anon表示可以匿名访问不需要认证)

a.在登录方法中

//获取Subject对象 (相当于创建给当前用户创建一个shiro框架中的当前对象)
Subject subject = SecurityUtils.getSubject();
password = MD5Utils.md5(password);
//用于存放当前用户的用户名和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
//调用安全管理器,安全管理器调用Realm
subject.login(usernamePasswordToken);

会自动调用realm 中的认证方法

5. 授权操作:

基于过滤器的权限控制:

在这个配置当中,perms[“staff”] 表示该路径需要具有admin权限才可以访问.

用户第一次访问该路径时需要执行realm中的授权方法.

基于注解的方式:

1. 需要在springmvc的配置文件中引入aop

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
2. 配置:

(该配置的意思是:自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面,属性proxy-target-class 为true表示基于类的代理被创建,为false基于接口的代理被创建)

<aop:aspectj-autoproxy proxy-target-class="true"/>

3. Spring的配置文件中也需要配置自动代理

4. 在需要被权限控制的类中创建ParameterizedType对象

ParameterizedType genericeSuperclass=null;
public ManagerController(){
genericeSuperclass=(ParameterizedType) this.getClass().getSuperclass().getGenericSuperclass();
}
5. 在需要访问的方法上添加注解
@RequiresPermissions("staff") //表示只有拥有staff权限的用户才能够访问

(注意:方法一与方法二可以重叠使用 ,但是尽量不要冲突)



基于标签的方式:

使用shiro标签根据权限展示页面元素

l 在jsp页面中引入标签库

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

l 使用标签

<shiro:hasPermiassion name="staff">

</shiro:hasPermission>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: