Недавно я работал над проектом приложений. Я разработал его в одиночку на заднем плане. Основные функции входа в систему, регистрации и проверки разрешений не были включены в первый этап разработки в порядке задач разработки. Теперь некоторые функции, связанные с бизнесом, были выполнены, но пользовательский портал еще не был реализован. Это только показывает, что я был слишком обеспокоен, когда я впервые проанализировал требования и поставил самый базовый пользовательский портал.
Теперь вам нужно добавить функции входа в систему и проверки разрешения на основе существующего кода.
Что касается входа в систему и проверки разрешений, ссылаясь на предыдущий опыт разработки iOS, сторона приложения предоставляет имя пользователя и пароль для обмена на токены, и для каждого запроса требуется разрешение для входа в систему через обмененный токен.
Теперь, с другой стороны, мне нужно рассмотреть следующие проблемы:
1. Как легко соответствовать реализации этих функций в коде существующих функций, чтобы существующий код не сильно изменился, и в будущем не будет никаких хлопот для реализации проверки разрешений.
2. Как генерировать токены на основе имени пользователя и пароля, и как различать правильность клиента, предоставляющих токены в функциях, которые требуют разрешений
Прежде всего, столкнувшись с первой проблемой, согласно опыту, обычным решением являются фильтры и перехватчики. Если логин и проверка разрешений помещаются в расположение требований, если URL -адреса более поздних функций получают определенную шаблон, использование фильтров или перехватчиков будет успешным. Но теперь я сталкиваюсь с URL -адресами, которые не имеют дизайна или спецификаций на ранней стадии, поэтому я не хочу сталкиваться с использованием фильтров или перехватчиков.
В дополнение к вышеуказанным обычным решениям, Spring AOP стал оружием для решения этой проблемы. Он использует лицевое программирование, чтобы обеспечить предварительное озабоченность для всех методов, которые требуют проверки разрешения. Однако, поскольку URL, имя класса или метод не являются регулярными, я подумал об пользовательской аннотации и проверяю разрешения для всех методов, которые добавляют пользовательские аннотации.
1. Поскольку вы уже думали об использовании Spring AOP, первым шагом является включение AOP в файле конфигурации пружины
// открыть AOP
<aop: AspectJ-autoproxy />
Вышеуказанная конфигурация основана на заливании пакетов JAR, связанных с пружиной, в проект, и введении URL-адреса AOP в заголовке файла конфигурации.
2. Далее давайте сначала определим пользовательскую аннотацию
@Target ({elementtype.method, elementtype.type}) @hareveration (armentpolicy.runtime) public @Interface userAccess {}3. Мы не можем спешить выполнять функции проверки разрешения, потому что наш токен еще не сгенерировал решение.
Для генерации токена рассматривается единый вход, поэтому токены не могут быть исправлены постоянно. В противном случае, в любое время, если у вас есть токены, по крайней мере два человека могут одновременно использовать одну и ту же учетную запись, что в настоящее время не допускается в нашем бизнесе. В конце концов, я выбрал «Имя пользователя + пароль + время входа в систему», чтобы сделать шифрование MD5 в качестве токена (существует много методов, таких как UUID при обеспечении уникальности и изменчивости). Создайте токены, когда имя пользователя и пароль успешно проверены, и сохраните токен в форме пар клавишных значений «Имя пользователя: токен» и «токен: пользователь» (также можно сохранить в базе данных) и, наконец, вернуть токен к клиенту.
Следующий код - просто простой пример:
@Servicepublic class loginservice {/*** store "Имя пользователя: token" paul-value pare*/public static map <string, string> tokenmap = new hashmap <String, String> ();/*** store "token: user" paul-value pare*/public Static Map <String, user> loginusermap = new hashhamap <string, user> ();); public String Login (String name, String Password) {System.out.println (name+"-----"+password);/*** Проверьте, успешно ли логин* 1. Вход успешно* 1.1. Успешно генерировать соответствующий токен и обновить * 1.2. Бросьте исключение, если оно не удалось*/string token = tokenmap.get (name); user user = null; if (token == null) {user = storm user (); user.setname (name); user.setpassword (пароль); System.out.println ("Новый пользователь Вход ");} else {user = loginUserMap.get (token); loginUsermap.remove (token); System.out.println (" Обновление токена пользователя пользователя ");} token = md5util.md5 (имя+пароль+new Date (). gettime (); loginusermap.put (token, user); token); system.out.println ("в настоящее время"+tokenmap.size ()+"users"); for (user u: loginusermap.values ()) {System.out.println (u.getName ()+":"+u.getPassword ());} token;}}}}}}}}}}}}4. В то же время наш клиент получил токен после входа в систему. Пока мы несем токен во всех запросах, которые требуют разрешения, мы можем успешно получить ответ (предложение: для облегчения кодирования приложения, токен может быть переносит в заголовке запроса, а существующий код не должен быть серьезными изменениями, и нам не нужно заботиться о проблемах токена в будущем). Я только что нашел метод для эксперимента:
@Controller@requestmapping ("/login") открытый класс logincontroller {@autowiredPrivate loginservice loginservice; @UserAccess @requestMapping (value = "/loginin", method = requestMethod.get) public @Responsebody String login (httpservletrequest) {string name = request.getParameter ("name"); String пароль = request.getParametОбратите внимание, что смелая часть состоит в том, чтобы настроить аннотацию. Невозможно иметь токены для параметров запроса функции входа в систему, поэтому независимо от того, сколько раз он проверяется, его нельзя пройти. Просто сделайте пример. @UserAccess Добавить только работы по функциональности, которая требует проверки разрешения
5. Пользовательская аннотация теперь хорошая точка входа
@Component@apsilepublic class разрешение {// установить пользовательскую аннотацию в качестве точки входа @before ("@annotation (com.example.chap01.annotation.useraccess)") public void checkpermission (joinpoint joinpoint). joinpoint.getargs (); httpservletrequest request = (httpservletrequest) args [0]; string token = request.getParameter ("token"); System.out.println ("Предварительный токен:"+token); user = loginservice.loginusermap.get (token); if (user == null) {System.out.println («Проверка не передается!»); бросить новое исключение («Нет разрешения»);}}}}}}}}}}}}}}}}}}На этом этапе все функции проверки входа и разрешения завершены.
Кроме того, прилагается исходный код на личном GitHub: https://github.com/zw201913/applogin.git
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.