# SSM_Shiro
Shiro与SSM结合,实现登录和授权功能
## 本人博客
https://www.jianshu.com/u/4a02af32281e
## 开篇
1. 本项目已经上传)[github](https://github.com/MyBaron/SSM_Shiro),建议对照代码理解
2. 本篇主要讲Shiro框架与SSM框架结合,实现登录和授权功能
3. 利用spring 的aop切面思想,很简单得融合Shiro权限框架
4. [代码](https://github.com/MyBaron/SSM_Shiro)
> 需要明白两个点:
> 1. 通过Subject.login() 登录成功后,用户信息就会保存在安全管理器上,也就是 SecurityManager。就可以在程序任何地方获取到该用户对象。
> 2. 在重写拦截器两个方法是重点,在登录的时候就需要把授权信息也存到安全管理器上,所以登录成功后,所有判断权限都不需要在业务逻辑上做判断,shiro框架已经帮你拦截并判断好。
## 1. jar包
shiro有很多种类型的包,用途有web的,非web的等,*-all 代表所有都在里面
``shiro-all.jar``
## 2.配置
其实shiro权限控制就是通过拦截器来进行判断用户权限的,因此shiro拦截器的配置跟springMVC的拦截器配置是类似的。
### 第一步
尽然是通过aop来使用shiro,那就需要在web.xml里添加一个shiro的拦截器。
> ps:这个shiro拦截器是如何加载的呢? 因为这个项目shiro与spring整合了,所有运行项目的时候,spring监听器会去寻找并加载shiro拦截器
```
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
```
shiro拦截器配置如下:
``` xml
<!-- 配置由Spring提供的过滤器,用于整合shiro框架 -->
<!-- 在项目启动的过程中,当前过滤器会从Spring工厂中提取同名对象 -->
<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>
```
### 第二步
类似springmvc一样,需要写一个配置文件来配置拦截器。
在shiro配置文件中,有两种类型。
- ini配置文件 (很多博客教程上都是使用这种配置方式。)
- xml配置文件 (这次项目使用这种配置方式)
首先创建shiro-context.xml
> ps: 很简单,就相当于spring的配置文件一样,因为shiro是跟spring很好结合的。
> 下面会慢慢解释这个配置文件
``` xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" /> <!--加载管理器-->
<property name="loginUrl" value="/user/login" /> <!--没有登录的时候,跳转到这个页面-->
<property name="unauthorizedUrl" value="/user/nopermission" /> <!--当没有权限的时候,跳转到这个url-->
<property name="filterChainDefinitions">
<value>
/user/login = anon <!--可以不需要登录-->
/user/readName = authc, perms[/readName] <!-- perms 表示需要该权限才能访问的页面 -->
/user/readData = authc, perms[/readData]
/user/* = authc <!-- authc 表示需要认证才能访问的页面 -->
</value>
</property>
</bean>
<!-- 自定义Realm -->
<bean id="myShiroRealm" class="com.Shiro.MyShiroReaml">
<!-- businessManager 用来实现用户名密码的查询 -->
<property name="shiroService" ref="accountService" />
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<property name="realm" ref="myShiroRealm"/>
</bean>
<!--声明一个Service 注入到自定义Realm-->
<bean id="accountService" class="com.Service.Impl.ShiroServiceImpl"/>
<!-- <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManager" ref="cacheManager" /> </bean> -->
</beans>
```
1. 拦截器需要加载一个安全管理器,SecurityManager 是整个shiro框架的核心
``` xml
<property name="securityManager" ref="securityManager" /> <!--加载管理器-->
```
2. 拦截url,这里就是配置拦截url。anon.authc.这些名词其实就是shiro已经写好的拦截器,只需要调用可以了。在如果权限不够,则会跳转到指定的url
```
<property name="filterChainDefinitions">
<value>
/user/login = anon <!--可以不需要登录-->
/user/readName = authc, perms[/readName] <!-- perms 表示需要该权限才能访问的页面 -->
/user/readData = authc, perms[/readData]
/user/* = authc <!-- authc 表示需要认证才能访问的页面 -->
</value>
</property>
```
过滤器列表:
![208783.jpg](http://upload-images.jianshu.io/upload_images/6212571-df692703a5785cd7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 第三步 拦截后,对用户进行验证
当你拦截器设置好了,可以成功拦截用户的操作,然后我们需要对用户进行权限验证。所以我们需要继承shiro的AuthorizingRealm拦截器,重写两个方法。
- 重写doGetAuthenticationInfo方法是:登录验证,当需要登录的时候,就会调用该方法进行验证。
- 重写doGetAuthorizationInfo方法:这个是授权验证,与上面的过滤器相结合。
思路如下:
- 登录验证: 根据账号从数据库获取账号密码进行比较,如果一致则登录成功,就会保存到,否则登录失败
- 授权验证:在登录成功后,根据用户id获取到该用户的权限,并把权限保存在安全管理器之中,当用户访问的时候,会从管理器中判断该用户是否有权限去访问该url。
代码如下:
``` java
public class MyShiroReaml extends AuthorizingRealm {
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
/**
*
* 流程
* 1.根据用户user->2.获取角色id->3.根据角色id获取权限permission
*/
//方法一:获得user对象
User user=(User)pc.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//获取permission
if(user!=null) {
List<Permission> permissionsByUser = shiroService.getPermissionsByUser(user);
if (permissionsByUser.size()!=0) {
for (Permission p: permissionsByUser) {
info.addStringPermission(p.getUrl());
}
return info;
}
}
//方法二: 从subject管理器里获取user
// Subject subject = SecurityUtils.getSubject();
// User _user = (User) subject.getPrincipal();
// System.out.println("subject"+_user.getUsername());
return null;
}
// 认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("进来验证了");
//验证账号密码
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
System.out.println("1:"+token.getUsername());
User user = shiroService.getUserByUserName(token.getUsername());
System.out.println("2");
if(user==null){
return null;
}
//最后的比对需要交给安全管理器
//三个参数进行初步的简单认证信息对象的包装
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getSimpleName());
return info;
}
private ShiroService shiroService;
public ShiroService getShiroService() {
return shiroService;
}
public void setShiroService(ShiroService shiroService) {
this.shiroService = shiroService;
}
}
```
### 第四步
shrio的基本配置已经完成了,接下来是基础代码块了, 也许还有很多疑问,没关�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
IDEA+SSM+Shiro(demo) (173个子文件)
loginController.class 4KB
loginController.class 4KB
MyShiroReaml.class 3KB
MyShiroReaml.class 3KB
ShiroServiceImpl.class 2KB
ShiroServiceImpl.class 2KB
Permission.class 2KB
Permission.class 2KB
User.class 1KB
User.class 1KB
Role.class 1KB
Role.class 1KB
ShiroDao.class 457B
ShiroDao.class 457B
ShiroService.class 329B
ShiroService.class 329B
TestDao.class 103B
TestDao.class 103B
.gitignore 291B
mvc_shiro.iml 6KB
javaee-api-7.0.jar 1.84MB
spring-context-4.0.2.RELEASE.jar 951KB
spring-core-4.0.2.RELEASE.jar 938KB
mysql-connector-java-5.1.30.jar 932KB
jackson-mapper-asl-1.9.13.jar 762KB
mybatis-3.2.6.jar 696KB
guice-3.0.jar 694KB
spring-beans-4.0.2.RELEASE.jar 653KB
spring-web-4.0.2.RELEASE.jar 649KB
spring-webmvc-4.0.2.RELEASE.jar 645KB
commons-collections-3.2.1.jar 562KB
shiro-all-1.2.4.jar 541KB
javax.mail-1.5.0.jar 510KB
log4j-1.2.17.jar 478KB
spring-test-4.0.2.RELEASE.jar 437KB
spring-jdbc-4.0.2.RELEASE.jar 410KB
jstl-1.2.jar 405KB
shiro-core-1.2.4.jar 371KB
fastjson-1.1.41.jar 350KB
spring-aop-4.0.2.RELEASE.jar 344KB
commons-lang-2.5.jar 273KB
commons-codec-1.9.jar 258KB
spring-tx-4.0.2.RELEASE.jar 242KB
jackson-core-asl-1.9.13.jar 227KB
commons-beanutils-1.8.3.jar 227KB
commons-beanutils-1.8.0.jar 226KB
spring-expression-4.0.2.RELEASE.jar 200KB
commons-io-2.4.jar 181KB
json-lib-2.4-jdk15.jar 155KB
spring-context-support-4.0.2.RELEASE.jar 132KB
commons-dbcp-1.2.2.jar 119KB
ezmorph-1.0.6.jar 84KB
spring-oxm-4.0.2.RELEASE.jar 78KB
commons-fileupload-1.3.1.jar 67KB
activation-1.1.jar 62KB
commons-pool-1.3.jar 61KB
commons-logging-1.1.3.jar 61KB
mybatis-spring-1.2.2.jar 48KB
shiro-guice-1.2.4.jar 45KB
guice-multibindings-3.0.jar 34KB
slf4j-api-1.7.7.jar 29KB
slf4j-log4j12-1.7.7.jar 9KB
aopalliance-1.0.jar 4KB
javax.inject-1.jar 2KB
loginController.java 4KB
MyShiroReaml.java 2KB
Permission.java 1KB
ShiroServiceImpl.java 1KB
newReaml.java 1KB
User.java 1KB
Role.java 845B
ShiroDao.java 678B
ShiroService.java 491B
TestDao.java 98B
login.jsp 501B
login.jsp 501B
permission.jsp 411B
permission.jsp 411B
data.jsp 347B
data.jsp 347B
name.jsp 346B
name.jsp 346B
index.jsp 332B
showperssion.jsp 332B
index.jsp 332B
showperssion.jsp 332B
test.jsp 331B
test.jsp 331B
error.jsp 328B
error.jsp 328B
update.jsp 315B
update.jsp 315B
index.jsp 224B
index.jsp 224B
README.md 12KB
MANIFEST.MF 99B
.name 9B
log4j.properties 827B
log4j.properties 827B
log4j.properties 827B
共 173 条
- 1
- 2
资源评论
随风奔跑的十八岁
- 粉丝: 263
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三次样条插值在C语言如何实现步骤介绍.docx
- SD6084电流模式同步降压转换器固定频率1.5MHz二极管封装SOT23-5
- NokoPrint-wifi蓝牙USB连接打印机[安卓免费App]
- 20211115aMmF9NbS.zip
- 解线性方程组-直接解法:(Gauss)高斯消去法、列主元、全主元 - 北太天元
- MapReduce单词统计 hadoop集群
- 深度学习源码神经网络新闻分类多分类问题ipynb源码带数据集
- 深度学习源码神经网络用预训练的卷积神经网络ipynb源码带数据集
- 深度学习源码神经网络使用词嵌入ipynb源码带数据集
- 深度学习源码神经网络使用LSTM生成文本ipynb源码带数据集
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功