Shiro在SSM框架中的应用
如果想使用Relam的操作,那么必须要保证有一个具体的认证类实现了Relam接口
web.xml增加shiro的配置
<!-- 进行shiro的过滤器的配置 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<!-- 该参数表示shiro的生命周期将交由Spring容器进行管理(默认情况下,取值为false) -->
<!-- 如果将其内容设置为true,则表示由Servlet容器进行管理 -->
<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>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
在applicationContext.xml加入shiro配置项信息
配置shiro的登录入口
<!-- 此处表示使用内置的表单登录控制验证 -->
<bean id="formAuthenticationFilter" class="com.sk.shiro.MyFormAuthenticationFilter">
<!-- 定义出需要使用的参数,此参数与表单一一对应 -->
<property name="usernameParam" value="username"/>
<property name="passwordParam" value="password"/>
<!-- <property name="loginUrl" value="/login.jsp"/> 不用配置 默认是这个 -->
</bean>
配置Shiro过滤器
<!-- 配置shiro过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 表示现在要配置的是一个安全管理器 -->
<property name="securityManager" ref="securityManager"/>
<!-- 登录成功之后的跳转访问路径 -->
<property name="successUrl" value="/index.jsp"/>
<!-- 配置shiro里面需要使用到的过滤器操作 -->
<property name="filters">
<map>
<entry key="authc" value-ref="formAuthenticationFilter"/>
</map>
</property> <!-- shiro里面需要针对于所有的路径进行配置,所有的配置需要通过文本的形式设置 -->
<property name="filterChainDefinitions">
<value>
/login.jsp=authc<!--loginUrl 需要和loginUrl一致 -->
/successUrl=authc
/test/*=user
/test*=user
</value>
</property>
</bean>
配置SecurityManager管理器
<!-- 配置SecurityManager的管理 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 配置你需要使用的Realms -->
<property name="realms">
<list>
<ref bean="usernamePasswordRealm"/>
</list>
</property>
<!-- 定义要使用的session管理器 -->
<property name="sessionManager" ref="sessionManager"/>
</bean>
编写UsernamePasswordRealm进行认证授权
package com.sk.shiro; import java.util.HashSet;
import java.util.Set; import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
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; public class UsernamePasswordRealm extends AuthorizingRealm { @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("********** 2、用户角色与权限:doGetAuthorizationInfo **********");
String username = (String) principals.getPrimaryPrincipal() ; // 取得用户登录名
SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo() ; // 定义授权信息的返回数据
try {
Set<String> allRoles = new HashSet<>();
allRoles.add("admin");
Set<String> allActions = new HashSet<>();
auth.setRoles(allRoles);// 所有的角色必须以Set集合的形式出现
auth.setStringPermissions(allActions); // 所有的权限必须以Set集合的形式出现
} catch (Exception e) {
e.printStackTrace();
}
return auth;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
System.out.println("********** 1、用户登录认证:doGetAuthenticationInfo() **********");
// 1、登录认证的方法需要先执行,需要用他来判断登录的用户信息是否合法
String username = (String) token.getPrincipal() ; // 取得用户名
if(!"admin".equals(username)) {
throw new UnknownAccountException("用户名不存在");
}
// 需要通过用户名取得用户的完整信息,利用业务层操作
String password = (String) token.getCredentials();
System.err.println("密码"+password);
AuthenticationInfo auth = new SimpleAuthenticationInfo(username, password, "myRealm") ;
return auth ;
}
@Override
public boolean supports(AuthenticationToken token) {
MyAuthenticationToken t=null;
try {
t = (MyAuthenticationToken) token;
} catch (Exception e) {
e.printStackTrace();
}
return t.getLoginType() == LoginType.USERNAME_PASSWORD;
}
}
这是首页登录的jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"//"+request.getServerName()+":"+request.getServerPort();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%-- <base href="<%=basePath %>"> --%>
<%System.out.println("---"+basePath); %>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Shiro</title>
</head>
<body>
<form action="/login.jsp" method = "post">
用户名<input type="text" name = "username" id = "username"><br>
密码 <input type="password" name = "password" id = "password"><br>
<input type="hidden" name = "loginType" value = "USERNAME_PASSWORD">
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
</html>
shiro登录的流程
从登陆的jsp的action找到配置的formAuthenticationFilter(此接口中有createToken等方法 根据登陆方式可以使用自定义token 实现HostAuthenticationToken, RememberMeAuthenticationToken接口 可以自定义token )
然后登录的路径被shiroFilter过滤
shiroFilter交给配置的securityManager去管理
securityManager又交给配置的usernamePasswordRealm去授权和认证(supports()方法返回true代表使用这个Realm去认证 此处为了兼容多种登陆方式 比如手机验证码、用户名密码 等)
登录成功之后的跳转访问路径
<property name="successUrl" value="/index.jsp"/>
Shiro在SSM框架中的应用的更多相关文章
- SSM框架中,controller的action返回参数给vue.js
在SSM框架中,controller的action中,返回的是视图,即jsp页面或是ModelAndView,若是通过axios给vue传值的话,需要转换为字符串或是user实体类对象. 使用@Res ...
- JAVA使用log4j(另SSM框架中使用log4j)
1.引入jar包 log4j-1.2.13.jar 2.src下建立配置文件:log4j.properties #不+All,只写后一种LOG log4j.rootLogger =ALL,system ...
- SSM框架中的前后端分离
认识前后端分离 在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端. ...
- maven springMVC SSM框架中 出现的406 (Not Acceptable)
首先,需要清楚,http state 406代表什么意思: 406是HTTP协议状态码的一种,表示无法使用请求的特性来响应请求的网页.一般指客户端浏览器不接受所请求页面的MIME类型. 出现这样的错误 ...
- 在SSM框架中我设置拦截器filter不能通过注解获取到实现类
我在用注解注入实现类的时候,出现了这样的错误:如以下截图: 这个地方报出的错误是说明我的一个接口类型的类没有获取到,后来我就想要是我的实现类没有获取到那么我就直接new一个实现类然后再进行调用就会出现 ...
- SSM框架中数据库无法连接的问题
首先是SSM框架中所有的配置都是没有问题的,而且项目在其他人的环境上也能正常访问数据库:那么最有可能的就是数据库版本的问题导致数据库连接不上,服务器给我的报错是: 15:37:25.902 [C3P0 ...
- 百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)
折腾了一下午终于把百度富文本编辑器ueditor搞定了! 项目地址:https://github.com/724888/lightnote_new 首先我参考了一个ueditor的demo ...
- SSM框架中的注解,配置和控制器相关笔记
常规SSM实例 探索SSM理论的前提,应该是在对框架基础的运作方式有一定了解,以下是个人Android后台项目,用SSM框架快速搭建,以下是代码,主要 观察结构. 代码结构: model实体类 Ida ...
- SSM框架中常用的配置文件
学习框架,刚开始的时候最烦的就是一些配置文件,有很多需要配置的东西,今天把这些配置文件信息稍微整理一下,以后说不定会用的到. web.xml文件 <?xml version="1.0& ...
随机推荐
- python3解决 json.dumps中文乱码
使用json.dumps()运行结果如下 role_name字段中文乱码了 只需要使用ensure_ascii=False 运行结果如下:
- 程序守护服务 Supervisor
一.什么是Supervisor? Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork ...
- nginx代理tcp协议连接mysql
阅读目录 一.mariadb安装及配置 1.1 在192.168.182.155安装mariadb 1.2 配置MariaDB的字符集 1.3 添加用户,设置权限 1.4 防火墙设置 二.nginx ...
- 在SOUI中使用动态多语言切换
动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...
- 多标签caffe重新编译
说明: Caffe自带的图像转LMDB接口只支持单label,对于多label的任务,可以使用HDF5的格式,也可以通过修改caffe代码来实现.本篇文章介绍怎么通过修改DataLayer来实现带Mu ...
- java自动化-关键字驱动在junit接口自动化的应用
本文是继承上文的基础上进行的讨论,建议读者先阅读http://www.cnblogs.com/xuezhezlr/p/9097137.html和https://www.cnblogs.com/xuez ...
- 51nod1007-正整数分组(dp)
题目 :http://www.51nod.com/Challenge/Problem.html#!#problemId=1007 大意就是给一堆正整数,分成和最接近的两组. 最开始没什么想法,2^n尝 ...
- 洛谷p3799:妖梦切木棒
题意:任选四段木板拼正三角形 因为是正三角形 所以我们可以想到至少是两个相同的,剩下两个拼成最后一条边 我们只需要枚举边长即可 那么我们对每次读入的x,使他的cnt++ 考虑用一个二重循环 外层枚举边 ...
- tf.contrib.slim add_arg_scope
上一篇文章中我们介绍了arg_scope函数,它在每一层嵌套中update当前字典中参数形成新的字典,并入栈.那么这些参数是怎么作用到代码块中的函数的呢?比如说如下情况: with slim.arg_ ...
- VB控件间的拖放
新建工程,放置控件Picture1,Text1,Text2,复制下面的代码运行 Text1和Text2可以互相拖放,也可以将Picture1拖放给Text1,Text2. Private Sub Fo ...