ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于spring-security框架的权限控制+注解方式设置权限

2021-06-14 22:32:35  阅读:88  来源: 互联网

标签:String spring private new security 权限 public


一般需要4张基础表和3张对应关系表。

菜单表 对应角色关系用Set表示:
/**
 * 菜单
 */
public class Menu implements Serializable {
    private Integer id;
    private String name;  //菜单名称
    private String linkUrl;  //访问路径
    private String path;  //菜单项对应的路由路径
    private Integer priority;  //优先级排序
    private String description;  //描述
    private String icon;  //图标
    private Set<Role> roles = new HashSet<Role>(0);  //角色集合
    private List<Menu> children = new ArrayList<Menu>();  //子菜单集合
    private Integer parentMenuId;  //父菜单Id
}
权限表 对应角色关系用Set表示:
/**
 * 权限
 */
public class Permission implements Serializable {
    private Integer id;
    private String name;
    private String keyword;
    private String description;
    private Set<Role> roles = new HashSet<Role>(0);
}
用户表 对应角色关系用Set表示:
/**
 * 用户
 */
public class User implements Serializable {
    private Integer id;
    private Date birthDay;  //生日
    private String gender;  //性别
    private String username;  //用户名。唯一
    private String password;  //密码
    private String remark;  //备注
    private String station;  //状态
    private String telephone;  //联系电话
    private Set<Role> roles = new HashSet<Role>(0);  //对应角色集合
}
角色表 对应用户,权限和菜单关系用Set表示:
/**
 * 角色
 */
public class Role implements Serializable {
    private Integer id;
    private String name;  //角色名称
    private String keyword;  //角色关键字,用于权限控制
    private String description;  //描述
    private Set<User> users = new HashSet<User>(0);
    private Set<Permission> permissions = new HashSet<Permission>(0);
    private LinkedHashSet<Menu> menus = new LinkedHashSet<Menu>(0);
}

导入springsecurity pom坐标:

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.sercurity.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.sercurity.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${spring.sercurity.version}</version>
        </dependency>

spring配置文件:

spring-security.xml

<beans>

    <!--配置那些资源匿名可以访问(不登录也可以访问)-->
    <!--<security:http security="none" pattern="/pages/**"></security:http>-->
    <security:http security="none" pattern="/login.html"></security:http>

    <!--auto-config自动配置,如果设置为true,表示自动应用一些默认配置,比如框架会提供一个默认的登录页面
    use-expressions 是否使用表达式-->
    <security:http auto-config="true" use-expressions="true">
        <!--配置拦截规则,/**表示拦截所有请求-->
        <!--pattern:描述拦截规则-->
        <!--access:指定所需访问角色或者访问权限-->
        <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url>

        <!--只要认证通过节能访问-->
        <security:intercept-url pattern="/index.jsp" access="isAuthenticated()" />
        <security:intercept-url pattern="/a.html" access="isAuthenticated()" />

        <!--拥有add权限就能访问-->
        <security:intercept-url pattern="/b.html" access="hasAuthority('add')" />

        <!--拥有ROLE_ADMIN角色节能访问c.htmlyemian-->
        <security:intercept-url pattern="/c.html" access="hasRole('ROLE_ADMIN')" />

        <!--如果我们要使用自己指定的页面作为登录页面,必须配置登录表单-->
        <security:form-login login-page="/login.html"
                             username-parameter="username"
                             password-parameter="password"
                             login-processing-url="/login.do"
                             default-target-url="/index.html"   默认页面
                             authentication-failure-url="/login.html"/>  登录失败页面
        <!--csrf:对应CsrfFilter过滤器 disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁止-->
        <security:cerf disabled="true"></security:cerf>
    </security:http>

    <!--配置认证管理器-->
    <security:authentication-manager>
        <!--配置认证提供者-->
        <security:authentication-provider user-service-ref="userService">
            <!--&lt;!&ndash;配置一个用户,后期需要从数据库查询用户&ndash;&gt;-->
            <!--<security:user-service>-->
                <!--<security:user name="admin" password="{noop}1234" authorities="ROLE_ADMIN"/>-->
            <!--</security:user-service>-->

            <!--指定密码进行加密的对象-->
            <security:password-encoder ref="passwordEncoder"></security:password-encoder>
        </security:authentication-provider>
    </security:authentication-manager>

    <bean id="userService" class="com.xuyu.service.SpringSecurityUserService"></bean>

    <!--配置密码加密对象-->
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoding"/>

    <!--开启spring注解-->
    <context:annotation-config></context:annotation-config>
</beans>

只需要Service实现security框架提供的UserDetailsService接口:

//实现security框架提供的接口
public class SpringSecurityUserService implements UserDetailsService {

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    //模拟数据库中的用户信息
    public static Map<String, User> map = new HashMap<String,User>();
    public void initUserData(){
        User user = new User();
        user.setUsername("admin");
        user.setPassword(passwordEncoder.encode("admin"));  //加密

        User user1 = new User();
        user1.setUsername("yuangong");
        user1.setPassword("2123");

        map.put(user.getUsername(),user1);
        map.put(user1.getUsername(),user1);
    }

    //根据用户名查询用户信息
    public UserDetals loadUserByUsername(String username){
        System.out.println("用户输入的用户名为"+username);
        //根据用户名查询数据库获得用户信息(包含数据库中存储的密码信息)
        User user = map.get(username);
        if(user == null){
            //用户不存在
            return null;
        }else {
            //将用户信息返回给框架
            //框架会进行密码比对(页面提交的密码和数据中查询的密码进行比对)
            ArrayList<GrantedAuthority> list = new ArrayList<GrantedAuthority>();  //授权,后期需要查询数据库
            list.add(new SimpleGrantedAuthority("permission_A"));  //授权
            list.add(new SimpleGrantedAuthority("permission_B"));

            if(username.equals("admin")) {  //只有admin才能登录
                list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));  //授予角色
            }
            security.core.userdetails.User securityUser = new security.core.userdetails.User(username,user.getPassword(),list);
            return securityUser;
        }
    }
}

基于方法注解方式进行权限设置:

spring-security.xml  添加注解开关


    <!--开启spring注解-->
    <context:annotation-config></context:annotation-config>

    <mvc:anotation-driven></mvc:anotation-driven>
    <context:component-scan base-package="com.xuyu.controller"></context:component-scan>

    <!--开启方法注解方式权限控制-->
    <security:global-method-security pre-post-annotations="enable" />

 编写测试类

@RestController
@RequestMapping("/hello")
public class HelloController {

    @RequestMapping("/add")
    @PreAuthorize("hasAuthority('add')")  //调用此方法要求当前用户必须具有add权限
    public String add(){
        System.out.println("test");
        return "success";
    }

    @RequestMapping("/delete")
    @PreAuthorize("hasRole('ROLE_ADMIN')")  //调用此方法要求当前用户必须具有ROLE_ADMIN角色
    public String delete(){
        System.out.println("delete test");
        return "success";
    }
}

 

标签:String,spring,private,new,security,权限,public
来源: https://blog.csdn.net/xy294636185/article/details/117913609

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有