搜尋
首頁类库下载java类库用spring security實現簡單的登陸和權限角色控制

首先想一下,登陸需要什麼,最簡單的情況下,用戶名,密碼,然後比對資料庫,如果吻合就跳到個人頁面,否則回到登陸頁面,並且提示用戶名密碼錯誤。這個過程中應該還附帶權限角色,並且貫穿整個會話。有了這個思路,我們只需要把資料庫的使用者名稱密碼交給spring security比對,再讓security進行相關跳轉,並且讓security幫我們把權限角色和使用者名稱貫穿整個會話,實際上,我們只需要提供正確的使用者名稱和密碼,以及設定下security。

目錄

準備工作

登陸頁

個人頁

開始設定spring security

 權限1.Apring security

準備資料庫表

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 :這裡注意的是roles的內容,LEADER也是MEMBER,這樣做,LEADER就擁有MEMBER的權限,當然你也可以在應用裡面作判斷,這個後面會說到。

<%@ 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 id="登录">登录</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>

個人頁面

<%@ 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 id="登录成功-username">登录成功!${username}</h3></security:authorize>  <!--  登陆成功会显示名字 -->

<security:authorize access="hasRole(&#39;MEMBER&#39;)">              <!--  MENBER角色就会显示 security:authorize标签里的内容-->
    <p>你是MENBER</p>
</security:authorize>

<security:authorize access="hasRole(&#39;LEADER&#39;)">
    <p>你是LEADER</p>
</security:authorize>


<sf:form id="logoutForm" action="${pageContext.request.contextPath}/logout" method="post">      <!--  登出按钮,注意这里是post,get是会登出失败的 -->
    <a href="#" onclick="document.getElementById(&#39;logoutForm&#39;).submit();">注销</a>
</sf:form>
</body>
</html>

開始設定spring security

啟動spring security

@Order(2)public class WebSecurityAppInit extends AbstractSecurityWebApplicationInitializer{
}

  繼承AbstractSecurityWebApplicationInalizer, )和spring security一起啟動出錯,具體是什麼我忘了,加上這個讓security啟動在後,可以避免這個問題,如果不寫@Order(2)沒有錯就不用管。

    2.配置權限

@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

  spring security提供給我們的獲取用戶資訊的Service,主要給security提供驗證使用者的資訊,這裡就可以驗證使用者的資訊,我可以自訂這個了根據username從資料庫獲取該使用者的信息,然後交給security進行後續處理

@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权限
        }
    }
}

如果你想在記住我功能有效情況下,在下次進入登陸頁面直接跳到個人首頁可以看一下這個控制器代碼

/**
     * 登录页面
     * @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";
    }

結果顯示:

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器