7.2权限控制

在这里插入图片描述
用7.1中的springsecurity来进行如下的功能拓展

登录检查

废弃原来的登录检查拦截器

//    @Autowired
//    private LoginRequiredInterceptor loginRequiredInterceptor;

授权配置

对当前系统内包含的所有请求,分配对应的访问权限(普通用户、版主、管理员)

    /**
     * 权限: 普通用户
     */
    String AUTHORITY_USER = "user";

    /**
     * 权限: 管理员
     */
    String AUTHORITY_ADMIN = "admin";

    /**
     * 权限: 版主
     */
    String AUTHORITY_MODERATOR = "moderator";

认证方案

配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter implements CommunityConstant {

    @Override
    public void configure(WebSecurity web) throws Exception {
        //忽略静态资源的拦截
        web.ignoring().antMatchers("/resources/**");
    }

    //忽略第二步重写author,因为我们现在的项目已经写好了相应的内容,要绕过去

    //第三步
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //授权
        //每个人开发的时候命名路径不一样,要注意
        http.authorizeRequests()
                .antMatchers(/* 以下路径需要有hasAnyAuthority()中的权限才能访问*/
                        "/user/setting",
                        "/user/upload",
                        "/discuss/add",
                        "/comment/add/**",
                        "/letter/**",
                        "/like",
                        "/follow",
                        "/notice/**",
                        "/unfollow"
                )
                .hasAnyAuthority(
                        AUTHORITY_ADMIN,
                        AUTHORITY_USER,
                        AUTHORITY_MODERATOR
                )
                .anyRequest()/* 其他任意的路径*/
                .permitAll()/* 都可以访问*/
                .and().csrf().disable();//图省事就把csrf给取消掉了,这样就不会给页面生成凭证了

        //权限不够时候的处理
        http.exceptionHandling()
                .authenticationEntryPoint(new AuthenticationEntryPoint() {
                                              //没有登录
                                              @Override
                                              public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
                                                  //如何判断是否是异步还是同步请求
                                                  String xRequestedWith = request.getHeader("x-requested-with");
                                                  if ("XMLHttpRequest".equals(xRequestedWith)) {
                                                      //满足就是异步请求
                                                      //异步时的处理
                                                      response.setContentType("application/plain;charset=utf-8");
                                                      PrintWriter writer = response.getWriter();
                                                      writer.write(CommunityUtil.getJSONString(403, "尚未登录"));
                                                  } else {
                                                      //非异步请求就直接重定向回去
                                                      response.sendRedirect(request.getContextPath() + "/login");

                                                  }
                                              }
                                          }
                )
                .accessDeniedHandler(new AccessDeniedHandler() {
                    /* 权限不足时的处理*/
                    @Override
                    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {
                        //如何判断是否是异步还是同步请求
                        String xRequestedWith = request.getHeader("x-requested-with");
                        if ("XMLHttpRequest".equals(xRequestedWith)) {
                            //满足就是异步请求
                            //异步时的处理
                            response.setContentType("application/plain;charset=utf-8");
                            PrintWriter writer = response.getWriter();
                            writer.write(CommunityUtil.getJSONString(403, "无访问此功能的权限"));
                        } else {
                            //非异步请求就直接重定向去权限不足的页面
                            response.sendRedirect(request.getContextPath() + "/denied");

                        }
                    }
                });

        //默认情况下security底层自动拦截/logout这个路径的请求,进行退出处理
        //我们要覆盖它底层默认的逻辑,才能执行我们自己的退出代码
        http.logout().logoutUrl("/securityLogout");//把它底层默认的拦截路劲给改了,这样就能执行我们自己的退出路径

    }
}

新增一个根据用户判断用户的权限的方法

    //根据用户判断用户的权限
    public Collection<? extends GrantedAuthority> getAuthorities(int userId){
        //
        User user = this.findUserById(userId);

        List<GrantedAuthority> list = new ArrayList<>();
        list.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                //返回权限的字符串
                switch (user.getType()){
                    case 1:
                        return AUTHORITY_ADMIN;
                    case 2:
                        return AUTHORITY_MODERATOR;
                    default:
                        return AUTHORITY_USER;
                }
            }
        });

        return list;
    }

}

在LoginTicketInterceptor类preHandle方法里hostHolder.setUser(user);之后添加

//构建用户认证的结果,并存入SecurityContext,以便于Security进行授权,
                Authentication authentication = new UsernamePasswordAuthenticationToken(
                        user,user.getPassword(),userService.getAuthorities(user.getId()));
                SecurityContextHolder.setContext(new SecurityContextImpl(authentication));
            

afterCompletion方法里hostHolder.clear();之后添加

        SecurityContextHolder.clearContext();

在LoginController类logout方法里userService.logout(ticket)后添加

SecurityContextHolder.clearContext();

CSRF配置

spring security是用token来解决CSRF攻击。开启security自动会在表单上生成token,但是异步请求没有form,需要自定义配置。
在这里插入图片描述
异步的时候没有表单,没法处理,那就要自己另外处理。例如发帖时,在index.html里头部添加


<!--	访问该页面时,在此处生成CSRF令牌-->
<!--	<meta name="_csrf" th:content="${_csrf.token}">-->
<!--	把表单传给服务器-->
<!--	<meta name="_csrf_header" th:content="${_csrf.headerName}">-->

异步请求传数据不是通过请求体,是通过请求消息头,如上设置之后spring security会生成csrf的key和value。在index.js里添加:

	发送ajax请求之前,把csrf令牌设置到请求的消息头中
	var token = $("meta[name='_csrf']").attr("content");
	var header = $("meta[name='_csrf_header']").attr("content");
	$(document).ajaxSend(function (e,xhr,options) {
		xhr.setRequestHeader(header,token);
	})

每个都要处理,麻烦就直接注释掉了Index和js中的csrf、

.and().csrf().disable();//图省事就把csrf给取消掉了,这样就不会给页面生成凭证了

之前的坑:

如果当前用户没有私心和赞报错:
把messageVO 放在判断之后。显示处理完以后要去前端看看!动脑子!前端页面也要把bug给改过来。
如果是followNotice.message!=null的话会直接因为followNotice为null而报错,所以要改成th:if="${followNotice!=null}"

   if (message != null) {
            Map<String, Object> messageVO = new HashMap<>();

            messageVO.put("message", message);

            String content = HtmlUtils.htmlUnescape(message.getContent());
            Map<String, Object> data = JSONObject.parseObject(content, HashMap.class);

            messageVO.put("user", userService.findUserById((Integer) data.get("userId")));
            messageVO.put("entityType", data.get("entityType"));
            messageVO.put("entityId", data.get("entityId"));
//            System.out.println("调试调试调试"+userService.findUserById((Integer) data.get("userId")));
            int count = messageService.findNoticeCount(user.getId(), TOPIC_FOLLOW);
            messageVO.put("count", count);

            int unread = messageService.findNoticeUnreadCount(user.getId(), TOPIC_FOLLOW);
            messageVO.put("unread", unread);

            model.addAttribute("followNotice", messageVO);

        }

<!--关注类通知-->
<li class="media pb-3 pt-3 mb-3 border-bottom position-relative" th:if="${followNotice!=null}">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Proxmox 7.2是一种开源的虚拟化管理平台,它基于Debian操作系统,并通过Proxmox虚拟环境(PVE)提供企业级虚拟化解决方案。系统文件是在Proxmox 7.2中存在的一些重要文件。 其中,最重要的系统文件之一是/etc目录。在这个目录下,我们可以找到一些配置文件,如/etc/network/interfaces用于配置网络接口,/etc/fstab用于配置文件系统的挂载点,/etc/apt/sources.list用于配置软件包库等。 另一个重要的系统文件是/var目录。在/var目录下,有一些子目录存储了系统运行所需的一些数据文件,如/var/log用于存储系统日志文件,/var/www用于存储web服务器的网站文件等。 此外,/root目录是root用户的家目录,里面存储了root用户的个人设置、脚本等文件。/home目录是普通用户的家目录,用于存储普通用户的个人文件。 /etc/apt目录存储了apt软件包管理工具的配置文件。这些配置文件指定了软件包的安装源和依赖关系等信息。 Proxmox 7.2还包含一些其他重要的系统文件,如/boot目录存储了引导加载程序相关的文件,/sbin和/bin目录存储了系统命令和工具,/lib目录存储了共享库文件等。 总而言之,Proxmox 7.2的系统文件包括/etc、/var、/root、/home、/etc/apt、/boot、/sbin和/bin、/lib等目录中的文件。这些文件在系统运行过程中起到了重要的作用,用于配置系统、存储数据和提供系统所需的命令和工具。 ### 回答2: Promox7.2是一种基于Debian Linux的开源操作系统,专门设计用于虚拟化环境和容器化技术。它提供了一个简单易用的管理界面,使用户能够方便地管理和监控虚拟机和容器。系统文件是Promox7.2中的重要组成部分,它包含了操作系统的各种配置文件、系统组件和关键程序。 系统文件在Promox7.2中起到了关键的作用。它们存储着Promox7.2操作系统的各种配置信息,例如网络配置文件、存储配置文件和用户配置文件等。系统文件还包括一些核心文件,如内核文件、驱动程序和关键程序等,这些文件组成了Promox7.2操作系统的基础架构。 通过管理系统文件,用户可以对Promox7.2进行高级配置和个性化定制。用户可以修改网络配置文件来调整网络设置,如IP地址、网关和DNS服务器等。用户还可以修改存储配置文件来管理磁盘、分区和文件系统等。此外,用户还可以修改用户配置文件来管理用户权限和访问控制等。 系统文件的备份和恢复也非常重要。用户应定期备份系统文件,以防止数据丢失或系统故障导致的损坏。备份系统文件可以使用一些工具和技术,如快照、复制和压缩等。当系统发生故障或需要重新安装时,可以使用备份文件进行系统恢复和配置导入。 总之,Promox7.2的系统文件是操作系统的关键组成部分,包含了各种配置和组件。管理系统文件可以帮助用户定制和优化系统设置,备份和恢复系统文件可以保护数据和避免系统故障。 ### 回答3: Proxmox 7.2系统文件是指Proxmox VE 7.2虚拟化平台所使用的一些核心文件和配置文件。Proxmox VE是一种开源的企业级虚拟化解决方案,用于在服务器上管理虚拟机和容器。 在Proxmox 7.2系统中,一些重要的系统文件包括: 1. pve-manager.conf:这是Proxmox VE管理器的主要配置文件,包含有关集群、存储、网络和其他功能的设置。 2. interfaces:这个文件包含有关网络接口的配置信息,如IP地址、网关、DNS服务器等。 3. sources.list:这是Proxmox VE软件包管理器的配置文件,用于指定软件源的位置,以便系统可以更新和安装新的软件包。 4. qm.conf:这个文件包含有关创建和管理虚拟机的设置,如内存、CPU、磁盘和网络等。 5. storage.cfg:这是用于配置存储设备和存储池的文件,可以指定存储设备的类型、路径和访问权限。 6. lxc.conf:这个文件是用于配置Linux容器的。可以设置容器的网络和资源分配,甚至可以自定义容器设置。 7. ha.conf:这是高可用性集群的配置文件,用于设置群集节点和监视其他节点的故障转移。 以上是Proxmox 7.2系统中一些重要的文件,这些文件包含了系统的配置信息、虚拟机和容器的设置以及高可用性配置。这些文件的正确配置和管理对于系统的稳定运行和性能至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值