当前位置: 首页 > 知识库问答 >
问题:

Spring安全角柱无支撑

高运诚
2023-03-14

我正在处理todo列表,它工作正常,但当我将spring security添加到project并单击添加时,它给出了

2016-07-10 04:32:34.441 WARN 6692---[nio-8080-exec-8]O.s.web.servlet.PageNotFound:不支持请求方法“POST”

这个问题的任何解决方案

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDS;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable();
        http
                .authorizeRequests()
                .antMatchers("/register", "/", "/home").permitAll()
                .antMatchers("/css/*").permitAll()
                .antMatchers("/images/*").anonymous()
                .antMatchers("/fonts/*").permitAll()
                .antMatchers("/js/**").permitAll()
                .antMatchers("/template/**").permitAll()
                .antMatchers("/favicon.ico").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .usernameParameter("email")
                .passwordParameter("password")
                .defaultSuccessUrl("/dashboard")
                .permitAll()
                .and()
                .logout().logoutSuccessUrl("/login?logout")
                .permitAll();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(userDS).passwordEncoder(passwordEncoder());
    }

    @Override
    protected UserDetailsService userDetailsService() {
        return userDS;
    }
}
@Controller
public class TaskController {

    @RequestMapping("/task")
    public String task() {

        return "task";
    }

}
<!DOCTYPE html>
<html ng-app="taskManagerApp">
<head>
    <meta charset="utf-8"/>
    <!--IE Compatibility Meta-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <!--first Mobile Meta-->
    <meta name="viewport" content="width=device-width, initial-scale=1"/>

    <title>Tasks</title>


    <!--css fontawesome jb-->
    <link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'/>


    <!--My Css File-->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css"/>


    <link rel="stylesheet" href="/css/task.css"/>

    <link rel="stylesheet" href="/css/animate.css"/>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>


    <link rel="stylesheet" href="/css/style.css"/>

    <!--if IT IE 9-->
    <script data-require="angular.js@*" data-semver="1.3.0-beta.14"
            src="http://code.angularjs.org/1.3.0-beta.14/angular.js"></script>
    <script data-require="angular-animate@*" data-semver="1.3.0-beta.14"
            src="http://code.angularjs.org/1.3.0-beta.14/angular-animate.js"></script>

    <script type="text/javascript" src="/js/app.js"></script>

    <script src="/js/html5shiv.min.js"></script>
    <script src="/js/respond.min.js"></script>
    <script src="/js/jquery-1.11.1.min.js"></script>
    <script src="/js/jquery.nicescroll.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="/js/main-p.js"></script>
    <script src="/js/plugin.js"></script>

    <!--endif-->


</head>
<body>

<!--==============Start Menu==========-->

<div class="row">

    <nav class="navbar navbar-inverse sidebar  col-sm-6 col-md-2" role="navigation">
        <div class="container-fluid">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse"
                        data-target="#bs-sidebar-navbar-collapse-1">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Todx</a>
            </div>
            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-sidebar-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="/dashboard">&#35; Dashboard<span style="font-size:16px;"
                                                                                 class="pull-right hidden-xs showopacity glyphicon glyphicon-home"></span></a>
                    </li>

                    <li><a href="/chat">Chat<span style="font-size:16px;"
                                                  class="pull-right hidden-xs showopacity fa fa-comments"></span></a>
                    </li>
                    <li><a href="/task">Tasks<span style="font-size:16px;"
                                                   class="pull-right hidden-xs showopacity fa fa-bolt"></span></a>
                    </li>
                    <li><a href="/files">Files<span style="font-size:16px;"
                                                    class="pull-right hidden-xs showopacity fa fa-paperclip"></span></a>
                    </li>
                    <li><a href="/calendar">Calendar<span style="font-size:16px;"
                                                          class="pull-right hidden-xs showopacity fa fa-calculator"></span></a>
                    </li>
                    <li><a href="/addtocalendar">Add to calendar<span style="font-size:16px;"
                                                                      class="pull-right hidden-xs showopacity fa fa-calendar-o
"></span></a>
                    </li>
                    <li><a href="/hangout">Hangout<span style="font-size:16px;"
                                                        class="pull-right hidden-xs showopacity fa fa-video-camera

"></span></a>
                    </li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Settings <span
                                class="caret"></span><span style="font-size:16px;"
                                                           class="pull-right hidden-xs showopacity glyphicon glyphicon-cog"></span></a>
                        <ul class="dropdown-menu forAnimate" role="menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                            <li class="divider"></li>
                            <li><a href="#">One more separated link</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
    </nav>

    <!--==========End Section Menu=========-->


    <!--==========Start Section Project=========-->

    <div class="right-side col-xs-11 col-sm-11 col-md-10">
        <!--==========Start Navbar=========-->
        <div class="container">
            <div class="row">
                <div class="col-md-12">
                    <div class="navbar-wrapper">
                        <div class="container">
                            <div class="navbar navbar-inverse navbar-static-top" role="navigation">
                                <div class="container">
                                    <div class="navbar-header">
                                        <button type="button" class="navbar-toggle" data-toggle="collapse"
                                                data-target=".navbar-collapse">
                                            <span class="sr-only">Toggle navigation</span>
                                            <span class="icon-bar"></span>
                                            <span class="icon-bar"></span>
                                            <span class="icon-bar"></span>
                                        </button>
                                        <a id="nav-brand" class="navbar-brand " href="#"><span
                                                class="fa fa-angle-right"></span></a>
                                    </div>
                                    <div class="navbar-collapse collapse horizon-nav">
                                        <ul id="home-page" class="nav navbar-nav ">
                                            <li id="activ"><a href="#"></a></li>
                                        </ul>
                                        <ul id="main-menu" class="nav navbar-nav navbar-right">
                                            <li id="profile"><a id="account" href="#" class="dropdown-toggle ">
                                                <img class="img-circle img-responsive"
                                                     src="/images/1.png"
                                                     style="margin-left:5; width: 50px;display: inline-flex "/></a>
                                            </li>
                                            <li id="logout"><a href="/logout">logout</a>
                                            </li>
                                        </ul>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!--==========End Navbar=========-->
        <!--==========Start Divs=========-->
        <!-- this is main Div that contain navbar divs  -->

        <div id="content" class="yellow col-xs-12">

            <!-- add task here !! -->
            <div ng-controller="taskManagerController">
                <div id="task-panel" class="fadein fadeout showpanel panel" ng-show="toggle">
                    <div class="panel-heading ">
                        <!--<i class="panel-title-icon fa fa-tasks"></i>-->
                        <div class="panel-heading-controls">
                            <i class="panel-title-icon fa fa-tasks"></i>

                            <span class="panel-title">Recent Tasks</span>
                            <button ng-click="toggle = !toggle" class="btn-md btn-panel ">Add New Task</button>
                            <button class="btn-md btn-panel  " ng-click="archiveTasks()"> Clear completed
                                <!--ng-confirm-click="Would you like to archive completed tasks?">Clear completed tasks-->
                            </button>
                        </div>
                    </div>
                    <div class="panel-body">
                        <div style="text-align: left" class="task" ng-repeat="task in tasks">
                <span ng-if="task.taskPriority=='HIGH'" class="priority priority-red">
                    {{task.taskPriority}}
                </span>
                <span ng-if="task.taskPriority=='MEDIUM'" class="priority priority-yellow">
                    {{task.taskPriority}}
                </span>
                <span ng-if="task.taskPriority=='LOW'" class="priority priority-green">
                    {{task.taskPriority}}
                </span>
                            <div class="action-checkbox">
                                <input id="{{task._links.self.href}}" type="checkbox" value="{{task._links.self.href}}"
                                       ng-checked="selection.indexOf(task._links.self.href) > -1"
                                       ng-click="toggleSelection(task._links.self.href)"/>
                                <label for="{{task._links.self.href}}"></label>
                            </div>
                            <div ng-if="task.taskStatus=='COMPLETED'">
                                <a href="#" class="checkedClass">
                                    {{task.taskName}}
                                    <span class="action-status">{{task.taskStatus}}</span>
                                </a>
                            </div>
                            <div style="text-align: left" ng-if="task.taskStatus=='ACTIVE'">
                                <a href="#" class="uncheckedClass">
                                    {{task.taskName}}
                                    <span class="action-status">{{task.taskStatus}}</span>
                                </a>
                            </div>
                        </div>
                    </div>
                </div>
                <div id="add-task-panel" class="fadein fadeout addpanel panel" ng-hide="toggle">
                    <div class="panel-heading">
                        <div class="panel-heading-controls">
                            <i class="panel-title-icon fa fa-plus"></i>
                            <span class="panel-title panel-title2">Add Task</span>
                            <button ng-click="toggle = !toggle" class="btn-panel">Show All Tasks</button>
                        </div>
                    </div>
                    <div class="panel-body">
                        <div class="task">
                            <table class="add-task">
                                <tr>
                                    <td>Task Name:</td>
                                    <td><input type="text" ng-model="taskName" class="form-group"/></td>
                                </tr>
                                <tr>
                                    <td>Task Description:</td>
                                    <td><input type="text" ng-model="taskDesc" class="form-group"/></td>
                                </tr>
                                <tr>
                                    <td>Task Status:</td>
                                    <td>
                                        <select ng-model="taskStatus"
                                                ng-options="status as status for status in statuses">
                                            <option value="">-- Select --</option>
                                        </select>
                                    </td>
                                </tr>
                                <tr>
                                    <td>Task Priority:</td>
                                    <td>
                                        <select ng-model="taskPriority"
                                                ng-options="priority as priority for priority in priorities">
                                            <option value="">-- Select --</option>
                                        </select>
                                    </td>
                                </tr>
                                <tr>
                                    <td><br/>
                                        <button ng-click="addTask()" class="btn-panel-big"
                                        >Add New Task
                                        </button>
                                    </td>
                                </tr>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <!--==========End Divs=========-->
    </div>

    <!--==========End Section Project=========-->


</div>


</body>
</html>

app.js

var taskManagerModule = angular.module('taskManagerApp', ['ngAnimate']);

taskManagerModule.controller('taskManagerController', function ($scope,$http) {

    var urlBase="";
    $scope.toggle=true;
    $scope.selection = [];
    $scope.statuses=['ACTIVE','COMPLETED'];
    $scope.priorities=['HIGH','LOW','MEDIUM'];
    $http.defaults.headers.post["Content-Type"] = "application/json";

    function findAllTasks() {
        //get all tasks and display initially
        $http.get(urlBase + '/tasks/search/findByTaskArchived?archivedfalse=0').
            success(function (data) {
                if (data._embedded != undefined) {
                    $scope.tasks = data._embedded.tasks;
                } else {
                    $scope.tasks = [];
                }
                for (var i = 0; i < $scope.tasks.length; i++) {
                    if ($scope.tasks[i].taskStatus == 'COMPLETED') {
                        $scope.selection.push($scope.tasks[i].taskId);
                    }
                }
                $scope.taskName="";
                $scope.taskDesc="";
                $scope.taskPriority="";
                $scope.taskStatus="";
                $scope.toggle='!toggle';
            });
    }

    findAllTasks();

    //add a new task
    $scope.addTask = function addTask() {
        if($scope.taskName=="" || $scope.taskDesc=="" || $scope.taskPriority == "" || $scope.taskStatus == ""){
            alert("Insufficient Data! Please provide values for task name, description, priortiy and status");
        }
        else{
         $http.post(urlBase + '/tasks', {
             taskName: $scope.taskName,
             taskDescription: $scope.taskDesc,
             taskPriority: $scope.taskPriority,
             taskStatus: $scope.taskStatus
         }).
          success(function(data, status, headers) {
             alert("Task added");
             var newTaskUri = headers()["location"];
             console.log("Might be good to GET " + newTaskUri + " and append the task.");
             // Refetching EVERYTHING every time can get expensive over time
             // Better solution would be to $http.get(headers()["location"]) and add it to the list
             findAllTasks();
            });
        }
    };

    // toggle selection for a given task by task id
      $scope.toggleSelection = function toggleSelection(taskUri) {
        var idx = $scope.selection.indexOf(taskUri);

        // is currently selected
        // HTTP PATCH to ACTIVE state
        if (idx > -1) {
          $http.patch(taskUri, { taskStatus: 'ACTIVE' }).
          success(function(data) {
              alert("Task unmarked");
              findAllTasks();
            });
          $scope.selection.splice(idx, 1);
        }

        // is newly selected
        // HTTP PATCH to COMPLETED state
        else {
          $http.patch(taskUri, { taskStatus: 'COMPLETED' }).
          success(function(data) {
              alert("Task marked completed");
              findAllTasks();
            });
          $scope.selection.push(taskUri);
        }
      };


    // Archive Completed Tasks
      $scope.archiveTasks = function archiveTasks() {
          $scope.selection.forEach(function(taskUri) {
              if (taskUri != undefined) {
                  $http.patch(taskUri, { taskArchived: 1});
              }
          });
          alert("Successfully Archived");
          console.log("It's risky to run this without confirming all the patches are done. when.js is great for that");
          findAllTasks();
      };

});

//Angularjs Directive for confirm dialog box
taskManagerModule.directive('ngConfirmClick', [
    function(){
         return {
             link: function (scope, element, attr) {
                 var msg = attr.ngConfirmClick || "Are you sure?";
                 var clickAction = attr.confirmedClick;
                 element.bind('click',function (event) {
                     if ( window.confirm(msg) ) {
                         scope.$eval(clickAction);
                     }
                 });
             }
         };
 }]);

注意,让它工作,它检索所有的任务,但在网络开发人员chrome控制台的帖子给405,我认为它是在spring security它以前在spring security上工作,但我不知道我做了什么,现在它不工作了

共有1个答案

雍兴修
2023-03-14

默认情况下,它假定所有传入的URL请求都是HTTP GET类型的。为了根据HTTP请求类型区分映射,我们需要在@RequestMapping声明中显式指定HTTP请求方法

如果您试图发帖到这个URL,Spring会拒绝它。

尝试将批注更改为

@RequestMapping(value = "/task", method = RequestMethod.POST)
public String task() {

    return "task";
}
@RequestMapping(value = "/task", method = RequestMethod.GET)
public String task() {

    return "task";
}

@RequestMapping(value = "/task", method = RequestMethod.POST)
public String postTask() {

    return "task";
}
@ResponseBody
@RequestMapping(value = "/task", method = RequestMethod.POST)
public String task() {

    return "task";
}
public String task(@RequestParam(value = "taskName") String taskName,
                   @RequestParam(value = "taskDescription") String  taskDescription,
                   @RequestParam(value = "taskPriority") String taskPriority, 
                   @RequestParam(value = "taskStatus") String taskStatus) {

    return "task";
}
 类似资料:
  • 客户端需要LDAP和本地JDBC身份验证机制。 它们需要一种对两组用户都通用的授权机制。 应该根据用户的角色限制用户进入某些页面。以及需要应用于每个用户的单独权限(创建、更新、删除)集 那么,我如何实现按页授权,这将由管理员决定谁(哪个角色)可以访问哪个页面? 是否应该在配置中指定每个角色页组合?是否有任何方法可以动态地改变页面和角色,因为角色可能会在以后添加。

  • 我正在尝试建立一个带有基本身份验证的普通Spring Boot环境。 基本上,我只想自定义用户、受保护的路径和自定义密码编码器。 Spring Boot留档状态: 要在不更改任何其他自动配置功能的情况下覆盖访问规则,请添加一个带有@Order(SecurityProperties.access_override_Order)的WebConfigurerAdapter类型的@Bean。 注意:我认为

  • 就像在本主题中一样,我的Spring Security应用程序也有问题。单击“身份验证”按钮时,即使输入了正确的数据,也会在控制台中看到: 访问位于“”的XMLHttpRequesthttp://localhost:8080/api/v1/basicauth“起源”http://localhost:4200'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:它没有HTTP ok状态。 而

  • 我目前正在编写一个位于weblogic服务器上的web应用程序。 我正在使用WebLogic的安全容器来验证对应用程序的访问。在weblogic.xml中,我有一个映射: ROLE_PORTAL_USER。 因此,我的问题是如何从weblogic获得角色并授予用户这些角色。例如,如果用户在weblogic中定义了security role Admin,我将如何在应用程序中读取该角色并给他们一个适当

  • 我正在使用Spring Security。我有一个控制器,其中某些方法必须能够被任何用户访问,无论他是否经过身份验证,某些方法必须能够仅访问使用JWT令牌进行身份验证的用户。我已经配置了一些带有acces="permitAll()"的模式,但似乎不起作用。如果我尝试访问localhost:8080/name-of-the-app/services/public/whatever我得到401,我在我

  • 我正在测试Spring Security中的登录方法。我想获得200的地位,但来了401。