В этой статье рассказывается о истории Spring Boot, интегрирующей Spring Security для реализации управления разрешением с использованием аннотаций по методам и использования пользовательского пользователя, для загрузки информации пользователя из MySQL. Используйте шифрование MD5, которое поставляется с безопасностью, чтобы зашифровать пароль пользователя. Шаблон страницы использует двигатель воли.
Адрес исходного кода: https://github.com/li5454yong/springboot-security.git
1. Внедрить зависимости POM
<parent> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <sersive> 1.4.4.1 </depervice> <dehyedency> <groupid> org.springframework.boot </GroupId> <StrifactId> Spring-Boot-Starter-Security </artifactid> </vehyederiation> <depertion> <groupid> org.springframework.security.oauth </GroupId> <ArtifactId> Spring-security-OauthId </GroupId> <ArtifactId>> spring-security-oauthId> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <groupId> com.alibaba </GroupId> <ArtifactId> Druid </artifactid> <serse> 1.0.15 </version> </vehyse> </dependencies>
Здесь используйте объединение подключений Druid, и дневные данные Spring JPA реализуют доступ к базе данных.
2. Настройка безопасности пружины
@Configuration @enablewebmvcsecurity @enableglobalmethodsecurity (prefostenabled = true) // включить аннотацию безопасности открытого класса WebsecurityConfig Extends webseCurityConfigurerAdapter {@Bean @Override Protected AuthenticationManager AuthenticationManager () Throws Excement {return Super.AuthenticationManager ();); } @Override Protected void configure (httpsecurity http) выбрасывает исключение {// разрешать всем пользователям доступ "/" и "/home" http.authorizerequests () .antmatchers ("/", "/home"). Разрешение () // Доступ к другим адресам требует проверки проверки. // Укажите страницу входа в систему как «/login» .loginpage ("/login") .defaultsuccescurl ("/hello") // После успешного входа, перейти к "/hello" по умолчанию. .permitall (). и () .logout () .logoutsuccessurl ("/home") // URL -адрес по умолчанию после регистрации "/Home" .permitall (); } @Autowired public void configureGlobal (AuthenticationManagerBuilder auth) Throws Exception {auth .UserDetailsService (CustomUserDetailsService ()) .PasswordEncoder (passwordEncoder ()); } / *** Установите метод шифрования пароля пользователя в шифрование MD5* @return* / @bean public md5passwordencoder passwordencoder () {return new md5passwordencoder (); } / *** Custom UserDetailsService для чтения пользовательской информации из базы данных* @return* / @bean public customuserdetailsservice customuserdetailsservice () {return new CustomeSerDetailsService (); }} Здесь производятся только основные конфигурации, настраивая URL -адрес входа, URL -адрес, который прыгает после успешного входа, и URL -адрес, который прыгает после входа. Использование аннотации @enableglobalmethodsecurity (prepostenabled = true) может включить аннотацию безопасности. Мы можем использовать @preauthorize и @prefilter на методах, которые требуют разрешений управления.
3. Пользовательский пользовательский промышленность
Общедоступный класс CustomUserDetailsService реализует userdetailsservice {@autowired // класс службы домена private suserservice waitservice; @Override public userDetails lokuserbyusername (String username) Throws usernameNotFoundException {// SUSER соответствует таблице пользователей в базе данных, которая является таблицей, которая в конечном итоге хранит пользователь и пароль, который может быть настроен // использует электронное письмо в Suser name: suser user = suserService.findeRemail (USERMAIL); if (user == null) {бросить новый usernamenotfoundexception («имя пользователя» + имя пользователя + «не найдено»); } // SecurityUser реализует userdetails и карты электронной почты Suser на имя пользователя SecurityUser SecurityUser = New SecurityUser (пользователь); Коллекция <SimpleGrantEdAuthority> власти = новый ArrayList <SimpleGrantEdAuthority> (); Orhations.Add (New SimpleGrantedAuthority ("role_admin")); вернуть SecurityUser; }}Здесь вам нужно только реализовать интерфейс userdetailsservice, переписать метод Loaduserbyusername и получить информацию пользователя из базы данных. Наконец, возвращается класс реализации userdetails.
4. Определите конфигурацию обработки ошибок
@Configurationpublic class errorpageconfig {@bean public intddedservletcontainercustomizer embeddesvletcontainercustomizer () {return new Mycustomizer (); } Частный статический класс MyCustomizer реализует EmbeddedServletContainerCustomizer {@Override public void настройка (confinemableEmbeddervletcontainer) {intainer.AdderRorpages (new Errorpage (httpstatus.forbiden, "/403"); }}}Когда возникает ошибка доступа, перейдите на «/403».
5. Интерфейс контроллера
@Controllerpublic class indexcontroller {@resource private souserservice souserservice; @Requestmapping ("/home") public String home () {return "Home"; } @Preauthorize ("hasrole ('user')") @requestmapping (value = "/admin", method = requestmethod.get) public String toadmin () {return "helloadmin"; } @RequestMapping ("/hello") public String hello () {return "hello"; } @Requestmapping ("/login") public String login () {return "login"; } @RequestMapping ("/") public String root () {return "index"; } @RequestMapping ("/403") public String error () {return "403"; }}@Preauthorize ("hasrole ('user')") используется в методе Toadmin (), что указывает на то, что вам необходимо иметь роль пользователя для доступа к этому методу. Если вы хотите контролировать уровень разрешений, вы можете использовать @preauthorize ("haspermission ()"). Это только одно из использования. Для получения дополнительных методов использования вы можете прочитать официальную документацию. Следует отметить, что префикс роли по умолчанию Spring Security является «ROLE_», который был добавлен по умолчанию при использовании метода Hasrole. Следовательно, наша роль пользователя в базе данных должна быть «ROLE_USER», а пользовательский префикс «ROL_» добавляется в пользователь.
6. тест
Начните проект и посетите http: // localhost: 1130/login
Нажмите, чтобы войти в систему и ввести "/Привет"
Нажмите, чтобы перейти на страницу администратора
В фоновом URL -адресе «/Admin», соответствующего методу «пользователя», пользователи должны играть роль «пользователя». Пользователь, который вошел в систему, также установлен в базе данных, чтобы играть эту роль.
Теперь мы изменяем роль пользователя в базе данных и изменяем ее на «ROLE_ADMIN». После входа в систему войдите снова, нажмите кнопку «Перейти к странице администратора», и она перейдет на следующую страницу.
Поскольку сейчас нет «пользовательского» разрешения, во время доступа было добавлено исключение, и оно было перехвачено и перенаправлено на «/403».
7. Post Access, код ошибки 403
Во -первых, изменить «/администратор» для публикации запроса
@Preauthorize ("hasrole ('user')") @requestmapping (value = "/admin", method = requestmethod.post) public String toadmin () {return "holloadmin"; }Измените метод запроса кнопки «Перейти к странице администратора» из исходного выражения формы. Получите представление Ajax Post. Что касается того, почему мы не отправляются с использованием сообщения формы, мы поговорим об этом позже. Сначала изменить код
<body><h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1><!--<form th:action="@{/logout}" method="post"> <input type="submit" value="Sign Out"/></form><form th:action="@{/admin}" method="get"> <input th: type = "propect" th: value = "Перейти на страницу администратора"/> </form>-> <a th: href = "@{/admin}" rel = "внешний nofollow"> перейти на страницу пользователя администратора </a> <input th: type = "Onclick =" testpost () "th: value =" Перейти к странице администратора "/> </cool> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> <clipt> $ .ajax ({url: "/admin", type: 'post', success: function (data) {}}); } </script> Нажмите кнопку «Перейти к странице администратора», и вы можете увидеть следующее в платформе отладки
Это связано с тем, что структура предотвращает CSRF (подделка по перекрестной подделке запросов по перекрестному запросу) подделка под подделкой запросов), ограничивая большинство методов, кроме GET.
Вот решение:
Сначала добавьте следующий контент в тег.
<meta name = "_ csrf" th: content = "$ {_ csrf.token}"/> <meta name = "_ csrf_hader" th: content = "$ {_ csrf.headername}"/>> Пока добавляется этот токен, фон подтвердит правильность этого токена. Если это правильно, он примет доступ к сообщению.
Затем добавьте следующий код в код AJAX:
var token = $ ('meta [name = "_ csrf"]'). attr ("content"); var header = $ ('meta [name = "_ csrf_hader"]'). attr ("content"); $ (документ). Таким образом, вы можете получить доступ к нему обычно, используя Post, Delete и другие методы.
Вышеупомянутый с использованием метода формы Post для отправки. Вы можете увидеть, просмотрев исходный код страницы.
Фреймворк автоматически вставляет скрытое поле в форму формы, и значение значения состоит в том, что токен, поэтому использование формы формы для отправки запроса POST может быть передано непосредственно, и если вы отправите его в пути Ajax, необходимо добавить этот код.
Хорошо, это все об этой статье. Позже будут статьи о том, как использовать Spring Security для управления разрешениями в стиле API REST.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.