Überlegen Sie zunächst, was zum Anmelden erforderlich ist. Im einfachsten Fall Benutzername und Passwort, und vergleichen Sie diese dann mit der Datenbank. Wenn sie übereinstimmen, springen Sie zur persönlichen Seite zurück und fordern Sie diese auf Der Benutzername und das Passwort sind falsch. Dieser Prozess sollte auch über Berechtigungsrollen verfügen und während der gesamten Sitzung fortgesetzt werden. Bei dieser Idee müssen wir nur den Benutzernamen und das Passwort der Datenbank zum Vergleich an die Spring-Sicherheit weitergeben und dann die Sicherheit relevante Sprünge vornehmen lassen und uns dabei helfen, die Berechtigungsrollen und Benutzernamen während der gesamten Sitzung einzugeben Tatsächlich müssen wir nur den richtigen Benutzernamen und das richtige Passwort angeben und die Sicherheit konfigurieren.
Verzeichnis
Vorbereitung
Anmeldeseite
Persönliche Seite
Mit der Konfiguration der Federsicherheit beginnen
1. Starten Sie den Frühling Sicherheit
2. Berechtigungen konfigurieren
3. UserDetailService schreiben
Bereiten Sie zunächst die Datenbanktabelle vor
CREATE TABLE `user` ( `username` varchar(255) NOT NULL, `password` char(255) NOT NULL, `roles` enum('MEMBER','MEMBER,LEADER','SUPER_ADMIN') NOT NULL DEFAULT 'MEMBER', PRIMARY KEY (`username`), KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PS: Achten Sie hier auf den Inhalt von Rollen: LEADER ist auch MITGLIED. Auf diese Weise verfügt LEADER über die Berechtigungen von MITGLIED. Natürlich können Sie in der Anwendung auch Urteile fällen, die später besprochen werden.
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> <html> <head> <title>登录</title> </head> <body> <div > <sf:form action="${pageContext.request.contextPath}/log" method="POST" commandName="user"> <!-- spring表单标签,用于模型绑定和自动添加隐藏的CSRF token标签 --> <h1 >登录</h1> <c:if test="${error==true}"><p style="color: red">错误的帐号或密码</p></c:if> <!-- 登陆失败会显示这句话 --> <c:if test="${logout==true}"><p >已退出登录</p></c:if> <!-- 退出登陆会显示这句话 --> <sf:input path="username" name="user.username" placeholder="输入帐号" /><br /> <sf:password path="password" name="user.password" placeholder="输入密码" /><br /> <input id="remember-me" name="remember-me" type="checkbox"/> <!-- 是否记住我功能勾选框 --> <label for="remember-me">一周内记住我</label> <input type="submit" class="sumbit" value="提交" > </sf:form> </div> </body> </html>
Persönliche Seite
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%> <%@taglib prefix="security" uri="http://www.springframework.org/security/tags" %> <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> <html> <head> <title>欢迎你,<security:authentication property="principal.username" var="username"/>${username}</title> <!-- 登陆成功会显示名字,这里var保存用户名字到username变量,下面就可以通过EL获取 --> </head> <body> <security:authorize access="isAuthenticated()"><h3>登录成功!${username}</h3></security:authorize> <!-- 登陆成功会显示名字 --> <security:authorize access="hasRole('MEMBER')"> <!-- MENBER角色就会显示 security:authorize标签里的内容--> <p>你是MENBER</p> </security:authorize> <security:authorize access="hasRole('LEADER')"> <p>你是LEADER</p> </security:authorize> <sf:form id="logoutForm" action="${pageContext.request.contextPath}/logout" method="post"> <!-- 登出按钮,注意这里是post,get是会登出失败的 --> <a href="#" onclick="document.getElementById('logoutForm').submit();">注销</a> </sf:form> </body> </html>
Frühlingssicherheit konfigurieren
Frühlingssicherheit starten
@Order(2)public class WebSecurityAppInit extends AbstractSecurityWebApplicationInitializer{ }
Beim Erben von AbstractSecurityWebApplicationInitializer wird Spring Security automatisch Vorbereitungen treffen. Hier ist @Order(2) der Fehler, als ich SpringMVC (ebenfalls eine reine Annotationskonfiguration) und Spring Security zusammen startete . Dieses Problem kann vermieden werden, wenn nichts Falsches daran ist, @Order(2) zu schreiben.
2. Berechtigungen konfigurieren
@Configuration @EnableWebSecurity @ComponentScan("com.chuanzhi.workspace.service.impl.*") public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ @Autowired private UserDetailService userDetailService; //如果userDetailService没有扫描到就加上面的@ComponentScan @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/me").hasAnyRole("MEMBER","SUPER_ADMIN") //个人首页只允许拥有MENBER,SUPER_ADMIN角色的用户访问 .anyRequest().authenticated() .and() .formLogin() .loginPage("/").permitAll() //这里程序默认路径就是登陆页面,允许所有人进行登陆 .loginProcessingUrl("/log") //登陆提交的处理url .failureForwardUrl("/?error=true") //登陆失败进行转发,这里回到登陆页面,参数error可以告知登陆状态 .defaultSuccessUrl("/me") //登陆成功的url,这里去到个人首页 .and() .logout().logoutUrl("/logout").permitAll().logoutSuccessUrl("/?logout=true") //按顺序,第一个是登出的url,security会拦截这个url进行处理,所以登出不需要我们实现,第二个是登出url,logout告知登陆状态 .and() .rememberMe() .tokenValiditySeconds(604800) //记住我功能,cookies有限期是一周 .rememberMeParameter("remember-me") //登陆时是否激活记住我功能的参数名字,在登陆页面有展示 .rememberMeCookieName("workspace"); //cookies的名字,登陆后可以通过浏览器查看cookies名字 } @Override public void configure(WebSecurity web) throws Exception { super.configure(web); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailService); //配置自定义userDetailService } }
3. UserDetailService schreiben
Spring Security stellt uns den Dienst zum Abrufen von Benutzerinformationen zur Verfügung, der hauptsächlich Sicherheit mit Informationen zur Überprüfung von Benutzern bietet . Hier können wir unsere eigenen Bedürfnisse anpassen, indem ich die Benutzerinformationen anhand des Benutzernamens aus der Datenbank abrufe und sie dann zur späteren Verarbeitung an den Sicherheitsdienst übergebe.
@Service(value = "userDetailService") public class UserDetailService implements UserDetailsService { @Autowired private UserRepository repository; public UserDetailService(UserRepository userRepository){ this.repository = userRepository; //用户仓库,这里不作说明了 } public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = repository.findUserByUsername(username); if (user==null) throw new UsernameNotFoundException("找不到该账户信息!"); //抛出异常,会根据配置跳到登录失败页面 List<GrantedAuthority> list = new ArrayList<GrantedAuthority>(); //GrantedAuthority是security提供的权限类, getRoles(user,list); //获取角色,放到list里面 org.springframework.security.core.userdetails.User auth_user = new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),list); //返回包括权限角色的User给security return auth_user; } /** * 获取所属角色 * @param user * @param list */ public void getRoles(User user,List<GrantedAuthority> list){ for (String role:user.getRoles().split(",")) { list.add(new SimpleGrantedAuthority("ROLE_"+role)); //权限如果前缀是ROLE_,security就会认为这是个角色信息,而不是权限,例如ROLE_MENBER就是MENBER角色,CAN_SEND就是CAN_SEND权限 } } }
Wenn Sie sich erinnern möchten die Wirksamkeit meiner Funktion Wenn Sie das nächste Mal die Anmeldeseite betreten und direkt zu Ihrer persönlichen Homepage springen, können Sie sich diesen Controller-Code ansehen
/** * 登录页面 * @param * @return */ @RequestMapping(value = "/") public String login(Model model,User user ,@RequestParam(value = "error",required = false) boolean error ,@RequestParam(value = "logout",required = false) boolean logout,HttpServletRequest request){ model.addAttribute(user); //如果已经登陆跳转到个人首页 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication!=null&& !authentication.getPrincipal().equals("anonymousUser")&& authentication.isAuthenticated()) return "me"; if(error==true) model.addAttribute("error",error); if(logout==true) model.addAttribute("logout",logout); return "login"; }
Die Ergebnisanzeige: