登录安全——拦截器和过滤器或权限框架的使用

本次我们将采用两种方法实现登录的安全性,首先介绍拦截器和过滤器。
一、 过滤器和拦截器:
过滤器产生的时间/开始工作的时间: 进入Tomcat之后,但是在进servlet之前。Interceptor进入了servlet
所以拦截器拦截的是动作,而过滤器拦截的是不合理的跳转页面。

1、配置和使用拦截器。

<mvc:interceptors>
<mvc:interceptor><!--   1.拦截所有的请求      --><mvc:mapping path="/**"/><!--  2.  mvc:exclude-mapping : 是一种拦截,可以放行或者对某个请求不拦截,     --><mvc:exclude-mapping path="/user/doLogin.do"/><!--  3. 告诉我们要用哪个拦截器      --><bean class="com.zhongruan.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>

</mvc:interceptors>

解释:除了login之外的请求都不允许执行

public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//在拦截点执行前拦截,如果返回true,则不执行拦截点后的才做//获取sessionHttpSession session = request.getSession();//获取访问路径String uri = request.getRequestURI();//indexOf函数:求出字符串内路径出现的下标if(session.getAttribute("userInfo")!=null){//登录成功,不拦截return true;}else{//拦截成功response.sendRedirect(request.getContextPath()+"user/doLogin.do");return false;}}@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//处理过程中,执行拦截
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//执行完毕之后,返回前拦截
}

}

重写拦截点前拦截动作的函数:
如果登录成功,则证明是真正的用户,所以放弃拦截(拦截器也因此失效);如果登录失败,则重新返回登录界面,且无法输入其他动作跳转到其他界面。

2、配置和使用过滤器:

<filter><filter-name>SessionFilter</filter-name><filter-class>com.zhongruan.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>SessionFilter</filter-name><url-pattern>/pages/*</url-pattern><url-pattern>*.jsp</url-pattern></filter-mapping>

上面是指请求所有界面都要通过过滤器,filter的实现如下:

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//区别:Interceptor进入了servlet,所以重写的参数时HttpServletRequest/Response//   Filter没有进入Servlet.ServletRequest//  ServletRequest是接口,HttpServletRequest是实现,这里有些方法是HttpServletRequest中独有的,例如getSession//所以要强制转换HttpServletRequest request = (HttpServletRequest)servletRequest;HttpServletResponse response = (HttpServletResponse)servletResponse;//以下类似拦截器了HttpSession session = request.getSession();if(session.getAttribute("userInfo") == null && request.getRequestURI().indexOf("/user/doLogin.do") == -1){// 没有登录,返回登录页面response.sendRedirect(request.getContextPath()+"/user/doLogin.do");}else{//已经登录了,继续请求下一步操作filterChain.doFilter(request,response);}
}

同样,过滤器使用过后就会失效,如果是真正的用户,可以访问其他界面,否则不能在登录界面访问其他界面。

结果展示:



二、 使用权限框架Spring-Security
1、首先在pom.xml文件中导入框架需要的jar包

<!--  spring.security架包      -->
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring.security.version}</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring.security.version}</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>${spring.security.version}</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>${spring.security.version}</version>
</dependency>

2、配置web.xml文件
添加如下语句:

<!--   配置 Spring-security;添加过滤器拦截所有请求  --><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping>

3、添加角色类:
由于验证机制是可以将用户类和管理员类区分开,登录后进入不同的界面,所以我们要增加一个角色类Role,它有三个属性:id,roleName和roleDesc,还有它们的get/set方法以及toString方法。
另外在UserInfo类中添加新的属性roleList(一个人可能对应多个角色)及其对应的方法。

4、添加Dao层:
新建一个名为“RoleDao”的接口类,并定义一个List findRoleByUserId(int userId);
方法。

 <select id="findRoleByUserId" parameterType="java.lang.Integer"        resultType="com.zhongruan.bean.Role">select * from tb_Role where id in(select roleId from tb_user_role    where userId=#{userId})</select>

可以看出,这个sql语句使用了多表查询。先在tb_user_role表中根据userid查询该用户的roleid,再在tb_Role表中查找该roleid对应的角色是什么。

5、service层:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 1. 查询当前登录的用户信息UserInfo userInfo = userDao.doLogin(username);System.out.println("获得的用户线信息为:"+ userInfo);// 2. 查询当前的用户有多少角色List<Role> roleList = roleDao.findRoleByUserId(userInfo.getId());// 3. 需要把角色给放入用户中userInfo.setRoleList(roleList);// 4. 把查询到的User和Role数据  给到Spring-security中的内置对象User来管理User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), getAuthority(userInfo.getRoleList()));return user;

}
下面是getAuthority的代码:

private Collection<? extends GrantedAuthority> getAuthority(List<Role> roleList) {
List<SimpleGrantedAuthority> list = new ArrayList<>();
for(Role role:roleList){list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
}
return list;

}
6、准备spring-security文件:

    <security:global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled"></security:global-method-security><!-- 配置不拦截的资源 -->
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>
<!--配置具体的规则auto-config="true" 不用自己编写登录的页面,框架提供默认登录页面use-expressions="false"    是否使用SPEL表达式(没学习过)
-->
<security:http auto-config="true" use-expressions="true"><!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" --><security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/><security:form-login login-page="/login.jsp"login-processing-url="/login.do"default-target-url="/index.jsp"authentication-failure-url="/failer.jsp"authentication-success-forward-url="/pages/main.jsp"/><!-- 关闭跨域请求 --><security:csrf disabled="true"/><!--退出并跳转到首页--><security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp"></security:logout>
</security:http><!-- 切换成数据库中的用户名和密码 -->
<security:authentication-manager><security:authentication-provider user-service-ref="userService"><!-- 配置加密的方式<security:password-encoder ref="passwordEncoder"/> --></security:authentication-provider>
</security:authentication-manager>
<!-- 配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

7、login.jsp页面:

这里直接用login.do而不是doLogin.do(之前的函数已经被注释掉了)。这个login.do的实现是在框架里写所以我们不需要管。

Aside.jsp页面:
由于登录后会在左上角显示登录用户的头像和信息以及可以进行的操作,所以需要在下拉菜单的链接加上一句<security:authentication property=“principal.username”></security:authentication>
同时加上如下代码:

<security:authorize access="hasRole('ADMIN')"><ahref="${pageContext.request.contextPath}/user/findAll.do?page=1&size=5"> <iclass="fa fa-circle-o"></i> 用户管理
</a></security:authorize>

意思是只有管理员拥有“用户管理”这个选项,普通用户界面不显示。
下面是运行结果展示:

如果是输入了错误的用户名或密码:

如果是管理员身份成功登录:

如果是用户身份成功登录:

实现安全登录的两种方法相关推荐

  1. 实现Windows XP自动登录的两种方法

    实现Windows XP自动登录的两种方法 方法1: 在进入Windows XP桌面之前,每次都会出现一个用户登录界面,要求我们输入用户名与密码,可以加大了系统的安全性,也为多人共用一台电脑提供了方便 ...

  2. Windows XP自动登录的两种方法

    单击开始→运行,输入rundll32 netplwiz.dll,UsersRunDll 点确定后调出"用户帐户"设置窗口,然后在User (用户)选项中取消Users must e ...

  3. 设置Windows XP自动登录的两种方法

    第一种是修改注册表 这种方法比较麻烦,而且要求对注册表有一定的了解. 第1步:运行注册表编辑器,依次展开 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows ...

  4. 让windows xp 自动登录的两种方法及脚本

    // 实现自动登陆 // 要求输入用户名和密码 // 将修改注册表 // 修改键位置 // HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVe ...

  5. 【VUE】vue实现登录滑动拼图验证的两种方法,纯前端组件验证以及前后端同时验证

    vue实现登录滑动拼图验证的两种方法: 第一种是纯前端组件验证,只能区分是人为操作还是机器操作. 第二种是前后端同时验证,这种方法加上后端校验相对会更安全一些.(注:在最底部加上了同时兼容移动端的方法 ...

  6. win7 计算机登录ftp 取消保存密码,Win7系统取消登录界面的两种方法(图文)

    本教程小编和大家分享Win7纯净版系统取消登录界面的两种方法,windows7系统设置电脑密码后,即使取消密码,也会出现登录界面 ,每次都要点击用户图标才能进入系统,这样比较麻烦.那么有什么办法可以取 ...

  7. Python进阶之使用Scrapy实现自动登录Github的两种方法(POST,FormRequest,from_response)

    Python进阶之使用Scrapy实现自动登录Github的两种方法 1. 通过.FormRequest()实现登录github github1.py 2. 通过.FormRequest.from_r ...

  8. 取消计算机用户密码页面,电脑怎么关闭开机密码_电脑开机取消登录密码的两种方法-系统城...

    为了电脑的安全和隐私,很多小伙伴在使用电脑时都会设置开机密码.然而有的用户却觉得在设置后每次开机都很麻烦,想要将其取消,那电脑怎么关闭开机密码呢?对于这一问题,今天小编就来教大家关于电脑开机取消登录密 ...

  9. 计算机无法关闭开机密码,电脑怎么关闭开机密码 电脑开机取消登录密码的两种方法...

    为了电脑的安全和隐私,很多小伙伴在使用电脑时都会设置开机密码.然而有的用户却觉得在设置后每次开机都很麻烦,想要将其取消,那电脑怎么关闭开机密码呢?对于这一问题,今天小编就来教大家关于电脑开机取消登录密 ...

最新文章

  1. 我学shell程序的记录
  2. boost::coroutine模块实现相同的边缘的测试程序
  3. python opencv 录制视频_OpenCV Python 录制视频
  4. windows设置自动清理log
  5. python代码少的作品_世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?...
  6. Android动态显示和隐藏状态栏
  7. 分布式id-数据库实现
  8. Jolt大奖获奖图书
  9. Tuxera NTFS 2020.2 for Mac 磁盘格式读写
  10. GPO 安装 .net 4.5和WMF4
  11. 安装blocksci mac出错_你的Mac与Big Sur兼容吗?
  12. 《基于深度学习的自然语言处理》中文PDF+英文PDF+学习分析
  13. OSI网络七层协议与TCPIP协议
  14. lamp phpstudy mysql_Phpstudy 搭建服务器教程
  15. 利用 pdf.js 实现在前端预览 .pdf 文件
  16. latex 显示黑色的点命令 black dot.
  17. 如何下载网上只能看不能下载的PPT文件
  18. Onvif协议学习:14、球机云台控制PTZ
  19. excel查询oracle数据库,用Excel直接查询Oracle中的数据
  20. 破解无线网络密码-BT3如何使用1

热门文章

  1. 小程序登录账号 提示系统繁忙,请稍后重试
  2. 胡适致毕业生:功不唐捐
  3. 生于80年代,穷于10年代,败于90后
  4. 滴滴校招编程题-田径运动会比赛排名
  5. 免实名的域名有吗?域名实名制认证有哪些要求?
  6. python经典案例
  7. 关于请设置注册表项Framewoke.....初始化错误的解决办法
  8. Mac安装并配置Git+SourceTree使用
  9. JavaScript——Web APIs
  10. js等待加载转圈圈效果