权限认证

243 阅读2分钟

1.没有用框架时自己的实现思路

用户登陆后要把用户信息及角色权限信息都存储起来
通过aop给每个controller做拦截
通过反射的方式获取要访问的路径
通过用户信息取出权限
通过权限和路径进行匹配
将判断结果存储在request域中实现判断结果的传递

2.重要名词

认证:通过用户名和密码成功登陆系统后,让系统得到当前用户的角色身份。
授权:系统根据当前用户的角色,给其授予对应可以操作的权限资源。

3.三个对象

用户:主要包含用户名,密码和当前用户的角色信息,可实现认证操作。
角色:主要包含角色名称,角色描述和当前角色拥有的权限信息,可实现授权操作。
权限:权限也可以称为菜单,主要包含当前权限名称,url地址等信息,可实现动态展示菜单。

4.核心思想

Spring Security是spring采用AOP思想,基于servlet过滤器实现的安全框架。

5.认证过程

提供了业务层的一个UserDetailsService接口,在认证的过程中它会调用我们写的具体实现类,而实现方法中的业务代码就是从数据库中查询出用户名、密码、角色信息,然后将查询结果中的部分信息放到框架提供的UserDetails这个类当中去

6.remember功能

通过cookie保存加密信息发送到浏览器来作为下一次登陆的凭证
如果要考虑更好的保密性能按照官方要求在数据库中创建一个表
    CREATE TABLE `persistent_logins` (
    `username` varchar(64) NOT NULL,
    `series` varchar(64) NOT NULL,
    `token` varchar(64) NOT NULL,
    `last_used` timestamp NOT NULL,
    PRIMARY KEY (`series`)
    ) ENGI

7.注解的使用

<!--
开启权限控制注解支持
jsr250-annotations="enabled"表示支持jsr250-api的注解,需要jsr250-api的jar包
pre-post-annotations="enabled"表示支持spring表达式注解
secured-annotations="enabled"这才是SpringSecurity提供的注解
-->
<security:global-method-security jsr250-annotations="enabled"
pre-post-annotations="enabled"
secured-annotations="enabled"/>
这里注意父子容器的关系 注解标在controller层就在springmvc的配置
========================================================================

8.异常处理

8.1 处理方式一

       public class ControllerExceptionAdvice {
       //只有出现AccessDeniedException异常才调转403.jsp页面
       @ExceptionHandler(AccessDeniedException.class)
       public String accessDeniedException() {
           return "forward:/403.jsp";
       }
   
       @ExceptionHandler(Exception.class)
       public String runtimeException() {
           return "forward:/404.jsp";
       }
   }

8.2 处理方式二

public class MyExceptionResolver implements HandlerExceptionResolver {

   @Override
   public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg", "系统异常");
       if (e instanceof MyException) {
           mv.setViewName("error");
       } else if (e instanceof AccessDeniedException) {
           mv.setViewName("forward:/403.jsp");//写redirect也可以
       } else if(e instanceof RuntimeException){
           mv.setViewName("redirect:/404.jsp");//写redirect也可以 404 没有机会进到这个controller
       }
       return mv;
   }
}
还有web.xml的配置方式就不介绍了